Добрый день! Есть задача сделать программу, которая бы с разных файлов проекта (раньше делали один файл - один лист) копировала виды (ну и по возможности оформление листов) и вставляла бы в многолистовой чертеж, соответственно со смещением на 1 лист по горизонтали относительно предыдущего. Короче из множества однолистовых файлов надо сделать один многолистовой.
Тут позже конечно еще всплывут заморочки с настройками листов - то есть как быть если размер шрифта текста, длина размерных стрелок и т.д, в каждом файле различаются, а в итоге придется прийти к чему то одному.
Ну а для начала надо разобраться как копировать вид. Не могу найти в интерфейсах видов, метод копировать. Помогите, пожалуйста!
Так как копировать Вам нужно из разных документов в один, то это можно делать только через функцию CopyGroupToDocument или буфер обмена: ksWriteGroupToClip, ksReadGroupFromClip. Параметрические связи и ограничения объектов при чтении из буфера теряются, атрибуты сохраняются. Перед копированием объекты нужного вида нужно поместить в группу.
Но так можно скопировать только объекты вида (можно ли копировать сам вид не знаю, не пробовал, но по идее наверно можно, вид это тоже объект с reference), а не документ целиком.
Нужно виды целиком копировать, в том числи и ассоциативные, причем с возможностью задания координат будущего расположения вида в новом документе.
Разобрался как работать с буфером обмена.
//Копирование:
void CopySelObjs() //Копирование выбранных объектов в буфер обмена
{
SetActiveDoc();
SelectionManager SelMng = doc_2D1.SelectionManager;
IDrawingGroups drawingGroups = doc_2D1.DrawingGroups;
if ((SelMng != null) && (drawingGroups != null))
{
IDrawingGroup drawingGroup = drawingGroups.Add(true, "111");
if (drawingGroup != null)
{
drawingGroup.Open();
drawingGroup.AddObjects(SelMng.SelectedObjects);
drawingGroup.WriteToClip(false, false);
drawingGroup.Close();
}
}
}
//Вставка:
void PasteObjs() //Вставка объектов из буфера обмена
{
SetActiveDoc();
IDrawingGroups drawingGroups = doc_2D1.DrawingGroups;
if (drawingGroups != null)
{
IDrawingGroup drawingGroup = drawingGroups.Add(true, "111");
if (drawingGroup != null)
{
drawingGroup.Open();
//drawingGroup.WriteToClip(false, false);
drawingGroup.ReadFromClip(false, false);
drawingGroup.Store();
drawingGroup.Close();
}
}
}
Только проблема при работе с видами - копирование выделенных видов работает нормально, а вставка видов не работает почему-то. Вставка работает только с графич. объектами - испытывал на отрезках, другие объекты не пробовал.
Понимаю, что тема мертва, но, может, подскажете, получилось ли разобраться с копированием-вставкой видов? Вставка также не работает.
Можно сделать через вставку вида из другого чертежа со взятием в документ и последующим разрушением. Только функция разрушения работает для документов, открытых в видимом режиме.
А вообще, и через буфер должно работать. У меня перенос объектов из вида чертежа во фрагмент получалось делать через копирование-вставку группы. Возможно даже на обоих API, а возможно седьмой себя показал не очень (точно не помню). На питоне.
Цитата: alice_liddell от 23.06.20, 08:35:18Понимаю, что тема мертва, но, может, подскажете, получилось ли разобраться с копированием-вставкой видов? Вставка также не работает.
Можно так:
Сначала выделить вид
iSelectionManager.Select(iView)
Потом через команду скопировать выделенное
iApplication.ExecuteKompasCommand (0xE122, 0)
В новом документе вставить из буфера обмена
iApplication.ExecuteKompasCommand (0xE125, 0)
Всё это можно делать только в видимом режиме
Еще есть константы:
ksCMEditCopy ID_EDIT_COPY Копировать в буфер обмена (0xE122)
ksCMEditPaste ID_EDIT_PASTE Вставить из буфера обмена (0xE125)
:beer:
Вставляется с координатами 0, 0. Потом надо дополнительно перемещать в нужное место.