IArc3D

Автор gabik, 26.01.13, 14:19:13

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gabik

Для получения интерфейса IArc3D, мне нужно получить интерфейс IArcs3D. Для получения IArcs3D нужен интерфейс IAuxiliaryGeomContainer. Как мне получить его? В документации написано:Данный интерфейс можно получить у компонента IPart7 посредством вызова метода IUnknown::QueryInterface (const GUID far& iid, void** pif). Это мне не понятно. Использую Automation. с помощью API 5 никак нельзя построить пространственную дугу? Вся новая функциональность компаса будет делаться только с API 7 и постепенно API 5 будет полностью заменено? Откуда взялись цифры 5, 7? API 7 стали вводиться с 7 версии компаса? с 5 версии была выпущена API 5?

var Part7:IPart7;

AuxiliaryGeomContainer:=Part7 as IAuxiliaryGeomContainer;
+ Благодарностей: 1

gabik

IArc3D категорически отказывается добавляться в макроэлемент ksMacro3DDefinition, где у нас спокойно хранятся ksEntity. Есть ли возможность преобразования?

#3
Воспользуйтесь функцией ksTransferInterface для преобразования интерфейсов примеры в SDK есть.
IArc3D - API7
ksMacro3DDefinition - API5 естественно они не совместимы.
P.S. Я работаю в COM и API7, иногда API5 использую как буфер обмена.

gabik

Если для создания IArc3D в API 5 нет аналога, то преобразовывать необходимо ksMacro3DDefinition в API 7?

Проблема в чём?
Я его и создавать начал бы в IMacro3DDefinition, просто в примерах на форуме не все могут различить ks и I, а это разные интерфейсы.

gabik

Т.е. я могу использовать IEntity в Automation?

Можете только должны прописать, что куда трансформируете, вот пример, правда не по теме.
Entity:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(ModelObject.Owner),ksAPI3DCom,o3d_entity)) as IEntity;

gabik

IEntity - не видит этот интерфейс. В какой библиотеки он находится? KompasAPI7 подключен.


gabik

И как я должен подключать её к проекту на C#? Как-то это совсем не православно. Есть для Automation API5, почему из-за необходимости построить пространственную дугу я должен теперь все переделывать на API7?( Такое ощущение что бардак или у меня в голове, или в компасе API.

Я программирую в Delphi и всех тонкостей Вашего языка не знаю, но страшного там ничего нет, нужно просто начинать сразу правильно, даже в том случае если везде тупик. 

gabik

В моем случае начинать правильно это использовать API 5. О существовании IEntity я должен вообще не знать. Исходя из этого я не смогу преобразовать даже свой макрообъект ksEntity в IEntity. А исходя из того что в API 5 странным образом не оказалось пространственной дуги я не могу преобразовать IArc3D из API 7.

Правильно начинать с API7 и основной объект IDispatch.
EdgeDefinition:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(IDispatch(Air5[II])),ksAPI3DCom,o3d_edge)) as IEdgeDefinition;

PS

ЦитироватьВ моем случае начинать правильно это использовать API 5. О существовании IEntity я должен вообще не знать. Исходя из этого я не смогу преобразовать даже свой макрообъект ksEntity в IEntity. А исходя из того что в API 5 странным образом не оказалось пространственной дуги я не могу преобразовать IArc3D из API 7.

В С++ API5 и API7 подключаются так:

#import <kAPI5.tlb> no_namespace named_guids rename( "min", "Imin" ) rename( "max", "Imax" ) rename ( "ksFragmentLibrary", "ksIFragmentLibrary" )

#import <kAPI7.tlb> no_namespace named_guids rename( "PostMessage", "IPostMessage" ) rename( "MessageBoxEx", "IMessageBoxEx" ) rename( "CreateWindow", "ICreateWindow" )

Возможно у Вас не нужно будет делать  rename.

Если интерфейса объекта нет в API5, то такой объект нельзя преобразовать из API7 в API5.
Если Вы только начинаете програмировать под Компас лучше использовать API7.

gabik

using KompasAPI7; т.е. библиотека подлкючена.
Все интерфейсы API7 видны, кроме IEntity. Можно каким-то образом сделать без него 3D макрообъект?

#16
Kompas6API3D5COM_TLB.h
Kompas6API3D5COM_TLB.cpp
kAPI3D5COM.tlb

gabik

IPart, IEntity - это интерфейсы API7 чисто COM-овские, их нельзя использовать в Automation, где используются ksPart и ksEntity (API5). Но есть возможность и COM и Automation использовать общие API7 интерфейсы, например IPart7 и т.д. Макрообъект в случае COM можно создать как в API7, так и в API5. При использование Automation только в API5(из IPart7 нет возможности получить 3D макрообъект). Но при этом существуют объекты, такие как IArc3D, которые не имеют аналогов в API5, и добавить их в макрообъект никак не получится.

А разве нельзя преобразовать интерфейсы из одного в другой при помощи функции ksTransferInterface?
В библиотеке нахождения объектов ниже приведённый код работает.
procedure FindIArc3DMouse(Value:ksEntity);
var
Arc3D:IArc3D;
begin
  Arc3D:=IUnknown(ksTransferInterface(PIUnknown(Value),ksAPI7Dual,0)) As IArc3D;
  ...

gabik

Я так понял можно преобразовать IEntity -> ksEntity, и наоборот, но преобразовать из Arc3D в ksEntity например нельзя... Интерефейсы наследованные от IPart7 не имеют аналогов в API5.