• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Создание локального фрагмента в чертеже

Автор BD11, 02.07.14, 18:15:28

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

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

BD11

Доброго времени суток! Я хочу создать локальный фрагмент прямо в чертеже. Нашел пример Step3a (в папке SDK Компаса) в котором есть функция DrawInsFragment2, создающая локальный фрагмент и вставляющая его в чертеж (ну я так понял). Проблема в том, что не работает почему то  :`(


Мой код:
void ButtonClick(object sender, System.EventArgs e)
{
// Подключаемся и запускаем Компас
Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
kompas = (KompasObject)Activator.CreateInstance(t);
kompas.Visible = true;

// Создаю чертеж
ksDocumentParam param = (ksDocumentParam)kompas.GetParamStruct((short)StructType2DEnum.ko_DocumentParam);
param.type = (short)DocumentTypeEnum.ksDocumentDrawing;
myDocument2D = (ksDocument2D)kompas.Document2D();
myDocument2D.ksCreateDocument(param);

// Вызываем функцию из примера "Step3a"
DrawInsFragment2(myDocument2D);
}



Код функции DrawInsFragment2 (взятой из примера Step3a):
// Вставка локального фрагмента
void DrawInsFragment2(ksDocument2D doc)
{
// определим фрагмент для вставки
ksFragment frg = (ksFragment)doc.GetFragment();
if (frg != null)
{
reference pDefFrg;
// определим локальный фрагмент
if (frg.ksLocalFragmentDefinition("local") == 1)
{
doc.ksLineSeg(0, 0, 10, 0, 1);
doc.ksLineSeg(0, 0, 0, 10, 1);
doc.ksArcByPoint(0, 0, 10, 10, 0, 0, 10, -1, 1);
pDefFrg = frg.ksCloseLocalFragmentDefinition();
if (pDefFrg > 0)
{
ksPlacementParam par = (ksPlacementParam)kompas.GetParamStruct((short)StructType2DEnum.ko_PlacementParam);
if (par != null)
{
par.angle = 45;
par.scale_ = 2;
par.xBase = 30;
par.yBase = 40;
// создаем объект "вставка фрагмента"
reference p = frg.ksInsertFragment(pDefFrg, false, par);
doc.ksLightObj(p, 1);
kompas.ksMessage("вставка локального фрагмента");
doc.ksLightObj(p, 0);
}
}
}
}
}



Все кончается на проверке if (frg.ksLocalFragmentDefinition("local") == 1) { ... } , ksLocalFragmentDefinition возвращает 0. Иными словами локальный фрагмент отказывается создаваться. В чем может быть дело?

Попробуйте полностью заполнить структуру ksDocumentParam перед вызовом myDocument2D.ksCreateDocument(param);

BD11

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

void ButtonClick(object sender, System.EventArgs e)
{
// Подключаемся и запускаем Компас
Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
kompas = (KompasObject)Activator.CreateInstance(t);
kompas.Visible = true;

// Параметры создаваемого документа
ksDocumentParam param = (ksDocumentParam)kompas.GetParamStruct((short)StructType2DEnum.ko_DocumentParam);
param.Init();
param.type = 1;
param.regime = 0;
param.fileName = "temp.cdw";
param.comment = "Temp document";
param.author = "Author";
ksSheetPar sheetParam = (ksSheetPar)param.GetLayoutParam();
sheetParam.Init();
sheetParam.shtType = 1;
sheetParam.layoutName = string.Empty;
ksStandartSheet stSheet = (ksStandartSheet)sheetParam.GetSheetParam();
stSheet.Init();
stSheet.format = 4;
stSheet.multiply = 1;
stSheet.direct = false;

// Создаем документ
myDocument2D = (ksDocument2D)kompas.Document2D();
myDocument2D.ksCreateDocument(param);

// Вызываем функцию из примера "Step3a"
DrawInsFragment2(myDocument2D);
}

Можно попробовать вставить PumpWaitingMessages; или kompas.ksPumpWaitingMessages; между строками:

myDocument2D.ksCreateDocument(param);   
PumpWaitingMessages;   
DrawInsFragment2(myDocument2D);

тем самым дать возможность функции ksCreateDocument отработать на 100%, также можно скомпилировать пример Step3a и проверить работает данный кусок кода или нет.

BD11

К сожалению "PumpWaitingMessages" не помогло. Проблема в том, что даже откомпилированный исходный Step3a не может создать локальный фрагмент! Вроде все остальное, что находиться в Step3a рабочее: элипс и NURBS рисует, штамп ставит, вставляет таблицу, фрагмент вставляет внешней ссылкой, но создавать свой локальный фрагмент отказывается (ничего не происходит).  :`(

Sabahs, а можете у себя проверить работоспособность вставки локального фрагмента?

Нормально создаёт.
+ Благодарностей: 1

BD11

Откомпилировал исходник на Visual Basic и он работает на половину. 3/4 круга отрисовались, но в "менеджере вставок вида и фрагментов" ничего не появилось, да и сама "фигура" не имеет целостности, которой обладают фрагменты (то есть, я могу не "разрушая" фрагмент перемещать его составляющие: 2 линии и дугу). Мне кажется, что и на VB код работает не корректно. Хоть в тех. поддержку Аскон пиши  :(((

Sabahs, а у вас в окне "менеджере вставок вида и фрагментов" появился фрагмент при выполнение программы?

В сообщении выше в архивах скомпилированная библиотека 32 и 64-разрядная, можете подключить и всё пощупать сами.

BD11

Я попробовал, результат точно такой же как и с исходниками на VB - рисуется фигура (3/4 круга), но никаким фрагментом там и не пахнет. В окне "менеджере вставок вида и фрагментов" пусто, а примитивы фигуры спокойно поддаются перемещению. С таким успехом можно было бы просто нарисовать эту фигуру...

Заметил интересную вещь, раньше я писал, что код (C#) не идет дальше момента if (frg.ksLocalFragmentDefinition("local") == 1) { ... } , так как ksLocalFragmentDefinition возвращает 0, т.е. локальный фрагмент отказывается создаваться.

Теперь решил глянуть исходники VB, там условие выглядит так: If Not frg.ksLocalFragmentDefinition("local") = 0 Then ... , оно выполняется и поэтому строиться фигура. Но если это условие переписать вот так: If frg.ksLocalFragmentDefinition("local") = 1 Then ... , то ничего далее не происходит, работа всей функции заканчивается. В чем дело? Метод ksLocalFragmentDefinition возвращает 0 или 1, в зависимости от исхода операции начала создания локального фрагмента.

Всё нормально создаёт, пере компилировал, прошёлся отладчиком, всё работает.
+ Благодарностей: 1

BD11

Вторая версия вашей библиотеки работает, а вот первый вариант только рисует (как я описывал выше). Удивительные метаморфозы, что вы изменили (помимо того, что 3/4 круга повернуты и вставляются в другое место)?  :%:

Ничего не менял, прошелся отладчиком.
+ Благодарностей: 1

BD11

Мистика какая то  8-)

Начну с того, что я еще раз взял вашу первую и вторую библиотеку х86. Они работают по разному. Первая библиотека просто строит геометрию в чертеже, но не сохраняет ее в фрагмент. Именно поэтому вставка фрагмента отсутствует, в параметрах которой указано увеличить масштаб фрагмента в 2 раза, повернуть на 45 градусов и вставить в указанные координаты. Эта ошибка хорошо видно и на вашем рисунке, который был прикреплен вместе с первой библиотекой, на котором геометрия находиться в начале координат, масштаб не увеличен, поворот отсутствует. Вторая ваша библиотека работает как надо - геометрия сохраняется в локальный фрагмент, который вставляется в чертеж под углом, с увеличенным масштабом и в нужное место. Я приложил рисунок работы двух ваших библиотек.

10.07.14, 06:19:03 #13 Последнее редактирование: 10.07.14, 09:22:58 от Sabahs
Я знаю, что работает по разному.
Суть в том, что в нормально работающем примере использованы экспортные функции API, а в неработающем примере использован интерфейс автоматизации ksFragment и функция которого, а именно ksCloseLocalFragmentDefinition возвращает нулевой указатель и дальнейшая работа прекращается.

Берём пример для автоматизации см.рис.1, не работает.
Комментируем строки и меняем их на экспортные функции см. рис.2, работает.
Но хочется, чтобы работало для автоматизации, думаем и делаем ход конём см. рис.3, работает.
+ Благодарностей: 2

BD11

Большое спасибо! Воспользуюсь способом №3, где был создана еще одна переменная ссылающаяся на активный документ. Не знаю зачем это было нужно, ведь по сути у нас активный документ уже определен, но работает! Что то тут разработчики намудрили видимо.  :)

Насколько я понял, что локальный фрагмент - это отдельный документ, т.е. получается документ в документе, поэтому при использовании интерфейса doc, объекты создаются в основном документе, а не в локальном фрагменте.
+ Благодарностей: 1

BD11

Sabahs, возможно ли как-нибудь потом получить свойства фрагмента после вставки (например, изменить расположение и масштаб)? Интерфейс фрагмента такими свойствами не располагает (я не нашел), но ведь как то Компас считывает информацию о этом фрагменте и позволяет ее редактировать.

Смотрите IInsertionsManager - интерфейс менеджера вставок фрагментов и видов, от него получите IInsertionDefinition - описание вставки фрагмента или вида, далее открываете документ-источник на редактирование IInsertionDefinition.Open.
+ Благодарностей: 1

BD11

Цитата: Sabahs от 11.07.14, 20:24:21
... далее открываете документ-источник на редактирование IInsertionDefinition.Open.

Не совсем пойму, что делать дальше? Открыл я на редактирование свой фрагмент, но как мне это должно помочь в узнавании местоположения этого фрагмента в чертеже?  88))