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

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

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

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

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

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

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

Редактирование внешних переменных ДО вставки фрагмента

Автор MrBarry, 17.11.23, 14:46:32

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

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

MrBarry

Я вставляю в чертёж фрагмент, который имеет несколько внешних переменных. Я могу изменять эти переменные после того, как вставлю фрагмент в чертёж (пробежаться через ksDocument2D.ksGetDocVariableArray() ), но не нашёл способа редактировать их ДО вставки, так, как это можно делать вручную в Компасе (см. скриншот). У ksFragment и его друга ksPlacementParam нет никаких методов для доступа к внешним переменным. Подскажите, как всё-таки это делается (если вообще возможно, в чём я на 98% уверен).Внаешние рс петремеонные (цфркаагмент 2).jpg

Nipal

Внешние, значит Компас их не видит, внешне поменяйте до действия.

p3452

Бред, какой-то!?
Цитата: MrBarry от 17.11.23, 14:46:32Я вставляю в чертёж фрагмент, который имеет несколько внешних переменных..., но не нашёл способа редактировать их ДО вставки...
А, сначала отредактировать переменные и потом уже вставить фрагмент, что мешает?

Михаил88

Цитата: MrBarry от 17.11.23, 14:46:32Подскажите, как всё-таки это делается (если вообще возможно, в чём я на 98% уверен)

Можно сделать через интерфейс IInsertionFragment

p3452


MrBarry

Цитата: Михаил88 от 17.11.23, 18:37:59Можно сделать через интерфейс IInsertionFragment
О, а я смотрел через API5, там такой возможности нет. Спасибо!
Цитата: Nipal от 17.11.23, 16:04:42Внешние, значит Компас их не видит, внешне поменяйте до действия.
Не видит когда фрагмент это файл на компьютере. Но когда он уже открыт в компасе, но не вставлен (как на скриншоте), то он уже в Компасе и тот всё видит. Превью фрагмента то видно, например, там же
Цитата: p3452 от 17.11.23, 16:10:16Бред, какой-то!?А, сначала отредактировать переменные и потом уже вставить фрагмент, что мешает?
Я и собираюсь отредактировать и потом вставить как бы. А если имеется в виду ещё раньше отредактировать, то это получается в момент когда фрагмент это просто файл на компьютере. А тогда я изменю его, а это плохо. В файле лежит стандартная версия, а редактируются переменные под каждый частный случай, и только те, что нужно изменить.

lavgirb

Цитата: MrBarry от 18.11.23, 10:07:27О, а я смотрел через API5, там такой возможности нет. Спасибо!Не видит когда фрагмент это файл на компьютере. Но когда он уже открыт в компасе, но не вставлен (как на скриншоте), то он уже в Компасе и тот всё видит. Превью фрагмента то видно, например, там жеЯ и собираюсь отредактировать и потом вставить как бы. А если имеется в виду ещё раньше отредактировать, то это получается в момент когда фрагмент это просто файл на компьютере. А тогда я изменю его, а это плохо. В файле лежит стандартная версия, а редактируются переменные под каждый частный случай, и только те, что нужно изменить.
Если редактирование файла приводит к желаемому результату, почему бы и нет?
После вставки редактируйте файл в исходное состояние. Если достаточно прав доступа.
Если прав не достаточно, копируете файл и потом делаете с копией что хотите )

p3452

Цитата: MrBarry от 18.11.23, 10:07:27
ЦитироватьБред, какой-то!?А, сначала отредактировать переменные и потом уже вставить фрагмент, что мешает?
Я и собираюсь отредактировать и потом вставить как бы. А если имеется в виду ещё раньше отредактировать, то это получается в момент когда фрагмент это просто файл на компьютере. А тогда я изменю его, а это плохо.
Еще раз - "бред"!
После того как вызвана команда "Вставка - Фрагмент", появится панель параметров, в ней таблица с переменными, а на экране - фантом Вашего фрагмента.
Меняя в таблице переменные Вы меняете фантом, а не оригинальный файл фрагмента!
Можно много раз поменять переменные, добавляя, в чертеж, каждый измененный фрагмент, но оригинальный файл останется неизменным!

feron

MrBarry, как реализуется копирование объектов в буфер обмена ? что можно сделать с получением(например GetDataObject) этого объекта?

p3452

Цитата: MrBarry от 17.11.23, 14:46:32У ksFragment и его друга ksPlacementParam нет никаких методов для доступа к внешним переменным...
Но ОНИ есть у любого 2D-документа...
Переменные_фрагмента.png

MrBarry

Цитата: lavgirb от 18.11.23, 19:27:00Если редактирование файла приводит к желаемому результату, почему бы и нет?
Я не упомянул, но ещё дело в том, что я без понятия как редактировать файл через API Компаса. То есть это и непонятно как делать, и ещё не нужно, потому вообще не вариант
Цитата: p3452 от 18.11.23, 22:18:57Я и собираюсь отредактировать и потом вставить как бы. А если имеется в виду ещё раньше отредактировать, то это получается в момент когда фрагмент это просто файл на компьютере. А тогда я изменю его, а это плохо.
Еще раз - "бред"!
После того как вызвана команда "Вставка - Фрагмент", появится панель параметров, в ней таблица с переменными, а на экране - фантом Вашего фрагмента.
Приятно, наверное, называть слова другого человека "бредом", ориентируясь на то, что он якобы имел в виду (после своего додумывания). Я не упомянул название команды и фантом (потому что я не активный пользователь Компаса с 1855 года в 6 поколении, и просто не знал всей терминологии), но имел в виду я именно это - редактировать таблицу параметров фрагмента во время вставки. Меняются переменные фантома? Замечательно, я только за.
Цитата: p3452 от 18.11.23, 22:18:57Можно много раз поменять переменные, добавляя, в чертеж, каждый измененный фрагмент, но оригинальный файл останется неизменным!
Я только ЗА, меня устраивает.
Цитата: feron от 19.11.23, 16:21:16MrBarry, как реализуется копирование объектов в буфер обмена ? что можно сделать с получением(например GetDataObject) этого объекта?
Я не копирую в буфер обмена, я вставляю напрямую
ksFragment frag = (ksFragment)doc.GetFragment();

ksPlacementParam par = (ksPlacementParam)kompas.GetParamStruct((short)StructType2DEnum.ko_PlacementParam);
// тут задаются параметры par

int ref1 = frag.ksFragmentDefinition(path, name, 1);
frag.ksReadFragment(path, true, par);
int ref2 = frag.ksInsertFragment(ref1, false, par);

Цитата: p3452 от 19.11.23, 19:58:32Но ОНИ есть у любого 2D-документа...
Я правильно понял, что этот код выполняется так:
1) Вставляется фрагмент в чертёж
2) Получаются внешние переменные конкретно этого фрагмента, без пересечения с другими переменными в этом же чертеже? Если да, то меня устраивает такой вариант, спасибо за идею
И поменьше грубости пожалуйста, спускать пар на других людях не лучшая идея, ещё и на публичном форуме

p3452

Цитата: MrBarry от 20.11.23, 10:13:02И поменьше грубости пожалуйста, спускать пар на других людях не лучшая идея, ещё и на публичном форуме
- Удачи (и нежности), в "одиночном плавании"!

MrBarry

#12
p3452, а что насчёт моего уточняющего вопроса?
Цитата: MrBarry от 20.11.23, 10:13:02Я правильно понял, что этот код выполняется так:
... ?
UPD: уже сам проверил, да, так и есть

feron

Цитата: MrBarry от 20.11.23, 10:13:02я вставляю напрямую

А там разве не нужно инициализировать переменную par перед тем как передать ей параметры ?

...
// тут задаются параметры par
par.Init();
...

Напишите весь участок кода вставки.

MrBarry

Цитата: feron от 21.11.23, 16:42:27А там разве не нужно инициализировать переменную par перед тем как передать ей параметры ?
Нужно, но я это и делаю (см. код в конце сообщения)

Там в этом же коде была другая ошибка (или скорее недоработка)
Методы ksReadFragment и ksInsertFragment выполняют одинаковую функцию, и я по сути вставлял два фрагмента по цене одного
Вчера проверил, если использовать ksReadFragment, то редактировать внешние переменные нельзя, а если ksInsertFragment, то всё работает

В итоге вот весь код функции (язык C#):
public static void insertFragment(KompasObject kompas, ksDocument2D doc,
    String path, double x0, double y0, double[] vars, String name = "Фрагмент")
{
    ksFragment frag = (ksFragment)doc.GetFragment();

    ksPlacementParam par = (ksPlacementParam)kompas.GetParamStruct((short)StructType2DEnum.ko_PlacementParam);
    par.Init();
    par.xBase = x0;
    par.yBase = y0;
    par.scale_ = 1;
    par.angle = 0;

    int frRef1 = frag.ksFragmentDefinition(path, name, 1);
    int frRef = frag.ksInsertFragmentEx(frRef1, false, par, false);

    ksDynamicArray variables = (ksDynamicArray)doc.ksGetDocVariableArray(frRef);
    for (int i = 0; i < (int)variables.ksGetArrayCount(); ++i)
    {
        ksVariable v = (ksVariable)kompas.GetParamStruct(85);
        variables.ksGetArrayItem(i, v);
        v.value = vars[i];
        variables.ksSetArrayItem(i, v);
    }
    doc.ksSetDocVariableArray(frRef, variables, false);
    doc.ksRebuildDocument();
}

Примечание: опытным путём выяснил, что если редактировать внешние переменные уже после вставки фрагмента (как в этом коде), то этот фрагмент может сдвинуться от своих начальных x0 y0. Лечится либо переписыванием кода так, как я хотел изначально и как написал в шапке темы, либо (как сделал я) добавлением ограничения "фиксированная точка" в сам фрагмент, чтобы тот никуда не дёргался при изменении размеров. Это впрочем тоже не панацея - фиксировать надо левую нижнюю точку. У меня было 3 фрагмента, каждый из которых был прямоугольником с чем-либо внутри, и потому левую нижнюю точку найти было очень легко. Если форма фрагмента не предусматривает такого простого, нужно как-либо выкручиваться