0

我尝试从 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)
4

1 回答 1

0

我对 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
...

让我知道这个是否奏效。

于 2014-04-22T19:33:48.907 回答