Доброго времени суток.
В рамках учебного проекта возникла задача: на Java построить дерево элементов 3D документа КОМПАС'а. А вот как работать с КОМПАС'ом в Java я не знаю. Может есть у кого-нибудь примеры, как это делается?
А может Вам нужно построить, что то типа этого?
(https://forum.ascon.ru/proxy.php?request=http%3A%2F%2Fwww.mariupolsapr.narod.ru%2FAPI7_3D.png&hash=31e2d199fd8220d37a02e62c0e1c094f729398c7)
Нет. В общем, будет дан эталонный 3D документ и измененный. Задание в том, что бы сравнить эти документы и получить в результате отчет, который показывает различия этих документов.
Есть реализация построения такого дерева на C#, но я не представляю как это делать на Java.
Выглядит это примерно так:
На Java реализации экспортных функций Компаса нет.
В общем такая проблема.
запускаю экземпляр компаса
ActiveXComponent kompas = new ActiveXComponent("KOMPAS.Application.5");
открываю документ
ActiveXComponent doc3D = kompas.invokeGetComponent("Document3D");
doc3D.invoke("Open", new Variant(name), new Variant(false));
получаю из документа ksPart
ActiveXComponent ksPart = doc3D.invokeGetComponent("GetPart", new Variant((short) 1));
и когда пытаюсь вызвать какие-либо методы или получить свойства
String fileName = ksPart.getProperty("fileName").getString();
то получаю NullPointerException.
Никак не пойму почему так происходит.
Использую JACOB.
ksPart - интерфейс Dispatch.
Нашёл пример с Excel, может чем поможет.
public class DispatchTest {
public static void main(String[] args)
{
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
Object xlo = xl.getObject();
try {
System.out.println("version="+xl.getProperty("Version"));
System.out.println("version="+Dispatch.get(xlo, "Version"));
xl.setProperty("Visible", new Variant(true));
Object workbooks = xl.getProperty("Workbooks").toDispatch();
Object workbook = Dispatch.get(workbooks,"Add").toDispatch();
Object sheet = Dispatch.get(workbook,"ActiveSheet").toDispatch();
Object a1 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
new Object[] {"A1"},
new int[1]).toDispatch();
Object a2 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
new Object[] {"A2"},
new int[1]).toDispatch();
Dispatch.put(a1, "Value", "123.456");
Dispatch.put(a2, "Formula", "=A1*2");
System.out.println("a1 from excel:"+Dispatch.get(a1, "Value"));
System.out.println("a2 from excel:"+Dispatch.get(a2, "Value"));
Variant f = new Variant(false);
Dispatch.call(workbook, "Close", f);
} catch (Exception e) {
e.printStackTrace();
} finally {
xl.invoke("Quit", new Variant[] {});
}
}
}
Ни черта не понимаю. делаю через Dispatch так
Dispatch ksPart = Dispatch.call(doc3D, Dispatch.getIDOfName(doc3D, "GetPart"), pTop_Part).getDispatch();
Где
Dispatch doc3D = kompas.invokeGetComponent("Document3D").getObject();
Dispatch.getIDOfName(doc3D, "GetPart") - получает id метода
и когда пытаюсь получить таким же образом из ksPart id методов или свойств то все равно получаю NullPointerException
Может я что-то не так делаю?
Цитата: aurum от 04.12.12, 12:31:27
В общем такая проблема.
запускаю экземпляр компаса
ActiveXComponent kompas = new ActiveXComponent("KOMPAS.Application.5");
В диспетчере задач процесс Компаса появляется?
Если нет, то дальше можно не продолжать.
Да, появляется, и документ открывается, и методы в doc3D вызываются, но дальше нифига
Никаких мыслей на этот счет нет?
Сразу говорю, что в Java я не спец.
На Delphi выглядит так iPart:=ksPart(iDocument3D.GetPart( pTop_Part ));
где:
ksPart - интерфейс iDispatch
GetPart - метод iDispatch
pTop_Part - значение передаваемое методу.
Проблема явно не в библиотеки. При использовании jawin рушится все на том же месте.