【问题标题】:How to get array data with CATIA using com4j API to get point coordinate?如何使用 com4j API 使用 CATIA 获取数组数据以获取点坐标?
【发布时间】:2014-04-23 22:32:48
【问题描述】:

我尝试从 catia usig com4j 检索信息。有些方法需要在参数中传递一个数组来检索信息,但该数组永远不会被填充。在这个例子中是从 catia 中的一个点获取坐标。

com4j生成的方法的声明

public interface Point extends com4j.catia.HybridShape {
     ...   

        void getCoordinates(java.lang.Object[] oCoordinates);
     ...
}

获取坐标的代码

 public static void testGetPointCoordinates() {
    String catiafile="E:\\test.CATPart";
    Application app =null;
    app = COM4J.createInstance(Application.class, "CATIA.Application");
    Documents documents = app.documents();
    Document oDocument = (Document) documents.open(new Holder<>(catiaFile.getAbsolutePath()));
    PartDocument partDocument =  oDocument.queryInterface(PartDocument.class);
    Part part =  partDocument.part();

    Factory HSFactory = part.hybridShapeFactory();
    HybridShapeFactory HSF = HSFactory.queryInterface(HybridShapeFactory.class);
    HybridBodies hbodies = part.hybridBodies();
    int n = hbodies.count();

    for (int i = 1; i <= n; i++) {
        HybridBody hbody = null;
        hbody = hbodies.item(i);
        int nbitems = hbody.hybridShapes().count();
        for (int j = 1; j <= nbitems; j++) {
            String name = hbody.hybridShapes().item(j).name();
            System.out.println("name=" + name);
            //Object tab[]=new Object[3];
            if (name.startsWith("Point.12")) {//true point
                HybridShape hs = hbody.hybridShapes().item(j);
                Reference reference = part.createReferenceFromObject(hs);
                HybridShapePointCoord p3 = hs.queryInterface(HybridShapePointCoord.class);
                //works
                System.out.println("point name = " + p3.name());
                System.out.println(p3.y().value());//display 50.0

                //doesn't work
                Variant tab[] = new Variant[3];
                for (int k = 0; k < 3; k++) {
                    Variant variant = new Variant();
                    variant.set(k);
                    tab[k] = variant;
                }
                p3.getCoordinates(tab);
                System.out.println(tab[1].getParseableString()); //display 1  (value not modified)
                //doesn't  work
                tab = new Variant[3];
                for (int k = 0; k < 3; k++) {
                    Variant variant = new Variant(Variant.Type.VT_EMPTY);//tested with VT_R4 VT_R8,...
                    tab[k] = variant;
                }
                 System.out.println(tab[1].getJavaCode()); //display null  (Don't know how to print VT_EMPTY as an Java literal)

                 //doesn't  work with this other solution but ok in VBA  
                tab = new Variant[3];
                //Variant v = new Variant(Type.VT_EMPTY);
                tab[0] = new Variant(Variant.Type.VT_EMPTY);
                tab[1] = new Variant(Variant.Type.VT_EMPTY);
                tab[2] = new Variant(Variant.Type.VT_EMPTY);
                HybridShapePointExplicit point = HSF.addNewPointDatum(reference);
                point.getCoordinates(tab);
                System.out.println(tab[1].doubleValue() + " " + tab[2].toString()); //display 0
                 //doesn't  work 
                //crash JVM
               // tab = new Variant[3];
               // p3.getCoordinates(tab);
                break;
            }
        }
    }
}

下面的代码在 VBA 和 CATIA 中工作

      Dim P1
      Dim coordonnees(2)
      Dim coordonnees2(100, 3)
      coordonnees(0) = 0
      coordonnees(1) = 0
      coordonnees(2) = 0
      Set P1 = HSF.AddNewPointDatum(hbody.HybridShapes.Item(i))
      'fonction to get coordinates
      P1.GetCoordinates coordonnees

      'set name and coordinates
      coordonnees2(Y, 0) = hbody.HybridShapes.Item(i).name
      coordonnees2(Y, 1) = Round(coordonnees(0), 3)
      coordonnees2(Y, 2) = Round(coordonnees(1), 3)
      coordonnees2(Y, 3) = Round(coordonnees(2), 3)

【问题讨论】:

    标签: java arrays variant com4j catia


    【解决方案1】:

    我不熟悉 com4j,但Point.GetCoordinates 是一种受限方法:

    .

    在 VB 中解决这个问题的方法是你需要创建一个新的变体并将它设置为等于 p3。然后,从变体的上下文中调用 GetCoordinates。 Intellisense 在变体上不能很好地工作,但对 GetCoordinates 的调用会工作。

    在 VB 中,代码如下所示:

    ...
    Dim p3 As Variant
    Dim arrayOfCoord(2) As Variant
    Set p3 = hybridShapePointCoord1 'set variant = strongly typed point object
    p3.GetCoordinates arrayOfCoord
    ...
    

    在您的情况下,非 VB,您的代码可能如下所示

    ...    
    Object p3Obj; //used in vb:Variant p3Var;
    p3Obj = p3;
    p3Obj.GetCoordinates(tab);//Intellisense will not work, but the call to this method should
    ...
    

    让我知道这是否有效。

    【讨论】:

    • P3 必须是 Point 类。问题是 GetCoordinates 方法不修改数组选项卡
    • @tao 你试过我上面提供的代码了吗?您收到任何错误消息吗?您的代码是否收到任何错误消息?我看到您制作了 tab 和变体数组,这是该方法期望的参数,所以这是我们可以排除的一件事。
    • 在 catia 的 VBA 中它正在工作:` Dim coordonnees(2) Set P1 = HSF.AddNewPointDatum(hbody.HybridShapes.Item(i)) 'fonction coordonnes P1.GetCoordinates coordonnees '获取名称+坐标coordonnees2(Y, 0) = hbody.HybridShapes.Item(i).name coordonnees2(Y, 1) = Round(coordonnees(0), 3) coordonnees2(Y, 2) = Round(coordonnees(1), 3) coordonnees2 (Y, 3) = Round(coordonnees(2), 3)`
    • @tao 那么你的问题解决了吗?您能否在您的问题中发布上面的代码,以便其格式正确...很难阅读。
    • Variant 是一个数字对象,P3 是一个点对象(不能强制转换)在 catia 中,VBA 代码正在运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多