Получение модели из чертежа

Я довольно часто сталкивался с задачей получения модели, её свойств, других данных прямо из чертежа. Например, чтобы получить какие-то модельные свойства, или свойства сборок. Делается это просто))

Для этого, необходимо сначала получить объект. А именно: выделить в виде нужную деталь или сборку. После этого, кодом получить тип выделенного объекта.

Это делается для того, чтобы дальнейший код работал без ошибок. Т.е. нужно работать именно с выбранным типом выделения.

Взглянем на пример:

swModel = (IModelDoc2)SwApp.ActiveDoc;
swSelectionMgr = (SelectionMgr)swModel.SelectionManager;
int SelObjType = swSelectionMgr.GetSelectedObjectType3(1, -1);

Сначала ссылаемся на активный документ. Пол учаем объект SelectionManager и определяем тип выделенного объекта.

Теперь, в зависимости от типа, мы можем получить необходимый объект модели IModelDoc2

Допустим, вы выделили в чертеже детали вид с моделью. Нижеследующий код получит ссылку на объект модели:

DrawingDoc swDraw = (DrawingDoc)swModel;
swView = (SolidWorks.Interop.sldworks.View)swDraw.ActiveDrawingView;
IModelDoc2 swCompModel = swView.ReferencedDocument;

Явно преобразуем текущий активный документ чертежа к типу IDrawingDoc. Получаем текущий выделенный вид, и получаем с него объект модели.

Теперь попробуем получить объект модели, если мы выбрали деталь или сборку прямо в дереве проектирования:

swComponent = (IDrawingComponent)swSelectionMgr.GetSelectedObject6(1, -1);
Component2 swComp = (Component2)swComponent.Component;
IModelDoc2 swCompModel = (IModelDoc2)swComp.GetModelDoc2();

Так как мы работаем в чертеже, то и объект его должен быть «чертёжный». А значит, сначала получаем IDrawingComponent. Преобразуем его в обычный IComponent2 из которого можем легко получить объект модели.

Вот и всё. 3 строчки кода, и из чертежа мы можем получить необходимые ссылки на объекты модели.


Так же, можно получить объект модели прямо из размера, проставленного на детали чертежа. Будь то сборочный чертёж или обычный! Для этого, выделим размер и запишем такой код:

DisplayDimension DisplayDimension = default(DisplayDimension);
Annotation swAnn;
SelectionMgr swSelectionMgr;
Component2 swComponent;
Entity swEntity;
IModelDoc2 swCompModel;
 
swModel = (IModelDoc2)SwApp.ActiveDoc;
swSelectionMgr = (SelectionMgr)swModel.SelectionManager;
int SelObjType = 0;
SelObjType = swSelectionMgr.GetSelectedObjectType3(1, -1);
     if (SelObjType == (int)swSelectType_e.swSelDIMENSIONS)
     {
         DisplayDimension = (DisplayDimension)swSelectionMgr.GetSelectedObject6(1, -1);
         swAnn = (Annotation)DisplayDimension.GetAnnotation();
         object[] vAttEntArr = (object[])swAnn.GetAttachedEntities3();
         swEntity = (Entity)vAttEntArr[0];
         swComponent = (Component2)swEntity.GetComponent();
         swCompModel = (IModelDoc2)swComponent.GetModelDoc2();
         string TTT = swCompModel.GetTitle();
      }

Сначала получаем тип, проверяем его. Если выделен размер, продолжаем. Преобразуем выделенный объект в DisplayDimension и получаем родительский класс Annotation. Из этого класса можно получить любую сущность ( в данном примере кромку, поверхность), к которой прикреплена аннотация. В данном коде с помощью GetAttachedEntities3 получаем прикреплённые сущности, из которых можно без труда получить объект модели этих сущностей. Ну и в конце, проверяем имя модели, для теста.

Теперь попробуем получить объект модели, если есть чертёж сборки. Выделим грань любой детали и запишем такой код:

int SelObjType = swSelectionMgr.GetSelectedObjectType3(2, -1);
if (SelObjType == (int)swSelectType_e.swSelFACES)
{
   object swObjComp = swSelectionMgr.GetSelectedObject6(2, -1);
   Face2 swFace = (Face2)swObjComp;
   Entity swEntity = (Entity)swFace;
   Component2 swComponent = (Component2)swEntity.GetComponent();
   IModelDoc2 swCompModel = (IModelDoc2)swComponent.GetModelDoc2();
}

Сначала получаем тип выделенного объекта

Это делается для того, чтобы дальнейший код работал без ошибок. Можно делать различные проверки, к примеру не грань а кромка.

Так как выделили грань/поверхность элемента, то можем преобразовать к интерфейсу IFace2. Дальше как по примеру выше: получаем сущность из интерфейса IFace2, по которой без труда получаем объект модели.