Доступ к объектам, на которые установлены 3D-размеры

Автор AndreyE13, 26.05.11, 11:02:00

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

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

AndreyE13

Вопрос следующий. Необходимо работать с объектами, на которые установлены 3D-размеры.

Пример: обозначение диаметра.
var DiametralDimension3D: IDiametralDimension3D;
После получения очередного элемента в DiametralDimension3D проверяю тип объекта, на котором он установлен:
if DiametralDimension3D.Object1.ModelObjectType = o3d_face then
Интересуют грани и рёбра. Дальше пытаюсь определить, что именно за объект, но тут возникают проблемы.
Face: IFaceDefinition;
Entity: IEntity;
...
Face:=IFaceDefinition(DiametralDimension3D.Object1);
Entity:=IEntity(Face.GetEntity);

Это всё срабатывает без ошибок, но если затем обратиться к Entity.GetName, то сваливается с ошибкой. То ли IModelObject, коим является Object1, нельзя так приводить, то ли ещё что. С рёбрами та же проблема, ничего не выходит (IEdgeDefinition).

Если кто-то подскажет, в чём я ошибаюсь, буду очень благодарен.


AndreyE13

Не похоже, стал бы ModelObjectType выдавать такую конкретику как o3d_face?

if DiametralDimension3D.Object1.ModelObjectType = o3d_face then
begin
  Faces:=IFaceCollection(DiametralDimension3D.Object1);
  showmessage(inttostr(Faces.GetCount));


-2147024809.

Скорее всего Вам нужно получить указатель на IModelObject и уже с ним поработать.
А в IFaceCollection
есть методы которыми цивилизовано можно будет найти указатель
FindIt
First
GetByIndex
GetByName
GetCount
Last
Next
Prev
Refresh

AndreyE13

И всё же объект там только один. Кроме того, DiametralDimension3D.Object1.Name выдаёт верное название поверхности, однако привести этот объект к IFaceDefinition не удаётся: «Интерфейс не поддерживается».
if DiametralDimension3D.Object1.ModelObjectType = o3d_face then
begin
  showmessage(DiametralDimension3D.Object1.Name); //<- выдаёт верное имя грани
  Unknown:=IUnknown(DiametralDimension3D.Object1);
  //ModelObject:=Unknown as IModelObject;
  Face:=Unknown as IFaceDefinition;
  Unknown:=IUnknown(Face.EdgeCollection);
  EdgeCollection:=Unknown as IEdgeCollection;
  showmessage(inttostr(EdgeCollection.GetCount));

Насчёт всех этих Unknown — в новом API напрямую приведение далеко не везде корректно работает, поэтому такие изощрения. Так и не понял, с чем это связано, ведь местами можно и напрямую.

Интерфейсная ошибка именно при попытке приведения к грани:
Face:=Unknown as IFaceDefinition;

Интересно, кроме меня кто-нибудь пытался с 3D-обозначениями работать? :)

chelkar

У Вас "в руках" ModelObject из API7, а IFaceDefinition это интерфейс из API5. Надо сделать преобразования через KompasObject::TransferInterface и тогда уже брать у него IFaceDefinition.

Встречное интересно. А что Вы хотите сделать с 3D-обозначениями?