如何使用com4j API使用CATIA获取数组数据以获得点坐标?

时间:2014-04-22 14:32:19

标签: java arrays variant com4j catia

我尝试从catia usig com4j中检索信息。某些方法需要将参数中的数组传递给retreive信息,但从不填充数组。在这个例子中是从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;
            }
        }
    }
}

以下代码适用于带CATIA的VBA

      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)

1 个答案:

答案 0 :(得分:0)

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

Call to a restricted method

在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
...

让我知道这是否有效。