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

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

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

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

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

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

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

Доступ к внешним переменным 2D чертежа

Автор azx, 29.03.21, 09:15:42

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

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

azx

Простите, может вопрос глупый, но только начал разбираться с API Компаса.
Есть параметрический чертеж в 2D, управляемый переменными, нужные переменные установлены как внешние (2 шт: lop и lmk). В программке на Delphi подключаю Компас и открываю этот чертеж. Далее хочу получить доступ к списку внешних переменных чертежа с целью изменить их значение и затем перестроить чертеж:
var Variable: ksVariable;
  VariableArray:ksDynamicArray;
...
VariableArray:=ksDynamicArray(Document2D.ksGetDocVariableArray(0));
Memo1.Lines.Add(format('Количество %d',[VariableArray.ksGetArrayCount]));
Memo1.Lines.Add(format('Тип %s',[VariableArray.ksGetArrayType]));
if VariableArray.ksGetArrayItem(0,Variable)=1 then
  Memo1.Lines.Add(format('Переменная %d ',[Variable.name]));
В итоге в Memo1 получаю:
ЦитироватьКоличество 2
Тип 10
Строка с текстом "Переменная" не появляется, условие не выполняется. То есть VariableArray.ksGetArrayItem(0,Variable) отрабатывается неверно. Пока не поставил условие if, выдавалась ошибка объект Variable не создавался.

Вопрос. Почему не создается переменная Variable? Может есть другой способ получить доступ к внешним переменным чертежа? Что об этом почитать?

Спасибо

graphdark

Цитата: azx от 29.03.21, 09:15:42Что об этом почитать?
Я по этой статье и примерам все делал.

Цитата: graphdark от 01.04.21, 11:38:51Я по этой статье и примерам все делал.
Я работаю по этом - SDK -c:\Program Files\ASCON\KOMPAS-3D v20\SDK\Samples\

azx

Цитата: graphdark от 01.04.21, 11:38:51Я по этой статье и примерам все делал.
Спасибо. Посмотрел. К сожалению в статье о доступе к переменным в 3D документе, а там несколько иначе все происходит, чем в 2D.

graphdark

Цитата: azx от 02.04.21, 13:19:28Спасибо. Посмотрел. К сожалению в статье о доступе к переменным в 3D документе, а там несколько иначе все происходит, чем в 2D.
Просто нонсенс рисовать чертежи без модели. А уж тем более пытаться программно чертеж нарисовать. Привет 80е.

azx

Цитата: graphdark от 02.04.21, 14:00:42Просто нонсенс рисовать чертежи без модели. А уж тем более пытаться программно чертеж нарисовать. Привет 80е.
Есть множество задач, в которых 3d вообще не нужно. Мне же нужно не вычерчивать программно весь чертеж, а управлять внешними переменными, о чем и тема. Привет!

СВ

#6
Есть множество задач, в которых ... не нужно не только вычерчивать программно весь чертеж, но и не нужно управлять внешними переменными.
Основная тема для переменных (для "программного черчения")- это однотипные детали/узлы  с большим количеством типоразмеров/исполнений, типа болты/гайки/крышки/кольца ... Ваша тема?
Чем эти 2Д-переменные отличаются о 3Д-переменных? Чем прямое управление ими (с прописанными нужными зависимостями) хуже программного?
Переменные.png

p3452

Цитата: СВ от 15.04.21, 15:18:09Чем прямое управление ими (с прописанными нужными зависимостями) хуже программного?
1. Что Вы будите делать с вашими "переменными", если таких чертежей сотни?
2. Программная реализация позволяет даже НЕ ИМЕТЬ (хранить) эти "чертежи" (для архива и синих печатей - растры или pdf), а создавать их в любой момент времени с любыми заданными параметрами-переменными.

СВ

 Так всё зависит от задачи, а о ней - ни слова. (Можно создать программу (с единственной всем известной "красной кнопкой") хоть по полному проектированию самолёта, только пока её напишешь, самолёты исчезнут...) Предполагаю, что как только начинающий конструктор, способный (и сильно склонный) к программированию, узнаёт о "волшебных возможностях программирования", он тут же бросается создавать эту кнопку. И дело это, в общем то, хорошее, тут не поспоришь.

graphdark

Цитата: azx от 29.03.21, 09:15:42Далее хочу получить доступ к списку внешних переменных чертежа с целью изменить их значение и затем перестроить чертеж:

Жестокая ирония. Дали мне чужой параметрический чертеж, попросили автоматизировать. Что Вы в variables кидали? Можете полностью код процедуры показать?

graphdark

Полезность форума просто зашкаливает. В общем немного порылся в гугле, примерах SDK. Читаю имена и комментарии с чертежа.


procedure TForm1.ReadVar(Sender: TObject);
var
  VarCol: ksVariableCollection;
  variable: ksVariable;
  ArrayVar: ksDynamicArray;
  Count, i: integer;
begin
  memo1.Clear;
  memo2.Clear;
  memo3.Clear;
  ArrayVar := ksDynamicArray(doc.ksGetDocVariableArray(0));
  Count := ArrayVar.ksGetArrayCount;
  Variable := ksVariable(Kompas.GetParamStruct(85));
//  Memo1.Lines.Add(IntToStr(Count));
  for I := 0 to Count - 1 do
  begin
    if arrayVar.ksGetArrayItem(i,Variable) = 1 then
      begin
        memo1.Lines.Add(Variable.name);
        memo3.Lines.Add(Variable.note);
      end;
  end;

end;

graphdark

Наверно возникнет вопрос о записи переменных, сразу отвечу:

procedure TForm1.WriteValues(Sender: TObject);
var
  VarCol: ksVariableCollection;
  variable: ksVariable;
  ArrayVar: ksDynamicArray;
  Count, i: integer;
begin
  Variable := ksVariable(Kompas.GetParamStruct(85));
  ArrayVar := ksDynamicArray(doc.ksGetDocVariableArray(0));
  for I := 0 to memo2.Lines.Count - 1 do
  begin
    if arrayVar.ksGetArrayItem(i,Variable) = 1 then
    begin
      Variable.value := StrToFloat(memo2.Lines[i]);
      arrayVar.ksSetArrayItem(i,Variable);
    end;
  end;
  doc.ksSetDocVariableArray(0,arrayVar,False);
  doc.ksSaveDocument({path + '.cdw'}path);
end;

graphdark

Внезапно перестал работать код установки значения переменной.
    variab := ksVariable(Form1.kompas.GetParamStruct(85));
    ArrayVar := ksDynamicArray(Doc2D.ksGetDocVariableArray(0));
//    ShowMessage(IntToStr(ArrayVar.ksGetArrayCount));
    for i := 0 to ArrayVar.ksGetArrayCount - 1 do
    begin
      if ArrayVar.ksGetArrayItem(i, variab) = 1 then
      begin
        // if Variab.name = 'zagot' then
        variab.value := Form1.BotGrid.DataSource.DataSet.FieldByName('Zagot')
          .AsInteger;
        ArrayVar.ksSetArrayItem(i, variab);
      end;
      Doc2D.ksSetDocVariableArray(0, ArrayVar, false);
      Doc2D.ksRebuildDocument;
При том в геткаунт 0, но одна переменная всегда есть.


graphdark

Думаю, что надо в ArrayVar := ksDynamicArray(Doc2D.ksGetDocVariableArray(0)); надо ksGetCurrentDocument(1) положить, но он описан только в LibTool, а у меня приложение. Но интересно, почему раньше работало.

Vi2

А Doc2D.ksGetDocVariableArray(Doc2D.reference) разве не потянет?

graphdark

Цитата: Vi2 от 23.10.21, 23:01:30А Doc2D.ksGetDocVariableArray(Doc2D.reference) разве не потянет?
У меня функция ставит размеры, создает виды и пр. посмотрел, что у меня в ShowMessage(IntToStr(Doc2D.reference)); В разных местах функции цифра была разной. Тогда я блок кода на изменение переменной унес к началу, к месту вызова функции. И сработало.