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

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

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

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

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

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

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

Параметры объектов эскиза

Автор AndreyE13, 26.05.11, 16:21:36

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

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

AndreyE13

26.05.11, 16:21:36 Последнее редактирование: 26.05.11, 21:50:08 от AndreyE13
Ещё одна проблема, с которой бьюсь уже несколько часов и абсолютно не понимаю причины.

Задача стара как мир: перебрать элементы эскиза и прочитать их параметры (для отрезков — координаты, для окружностей — центры и радиусы и т.д.).

Проблема в том, что указатели (Reference) на элементы получить удаётся, а вот прочитать их параметры — нет. GetObjParam() всё время возвращает 0 и в структуре параметров нет. Кроме того, после того, как библиотека отработала, Компас выдаёт сообщение «Размер структуры параметров не соответствует указанному». Что именно не соответствует и с чего бы? В примерах всё делается абсолютно так же, но почему не работает у меня? Пробовал даже рисовать элементы, запоминая на них указатель и тут же пытаться считать их параметры — та же история, не выходит.

var
Sketch: ISketchDefinition;
Iterator: ksIterator;
Kompas: KompasObject;
LineSegPar: LineSegParam;

if Sketch.BeginEdit = 0 then
begin
  ShowMessage('Не удалось перейти в режим редактирования эскиза.');
  Continue;
end;

Kompas:=KompasObject(CreateKompasObject());
Iterator:=ksIterator(Kompas.GetIterator);
Iterator.ksCreateIterator(ALL_OBJ,0);
Ref:=Iterator.ksMoveIterator('F');

while Ref <> 0 do
  if ExistObj(Ref) = 1 then
  begin
    ObjType:=GetObjParam(Ref,nil,0,0);
    Memo1.Lines.Add('Объект типа '+inttostr(objtype)+' [Ref='+inttostr(ref)+']');
    if ObjType = LINESEG_OBJ then
    begin
      if GetObjParam(Ref,Addr(LineSegPar),SizeOf(LineSegPar),ALLPARAM) = LINESEG_OBJ then
        Memo1.Lines.Add(Format('%f;%f - %f;%f',[LineSegPar.x1,LineSegPar.y1,LineSegPar.x2,LineSegPar.y2]));
    end;
    Ref:=Iterator.ksMoveIterator('N');
  end;
Iterator.ksDeleteIterator;


В чём проблема — ума не приложу, примеры-то работают (например step3).


AndreyE13

Хм, любопытно, спасибо. Но замена ALLPARAM на -1 ничего не дала:

if GetObjParam(Ref,Addr(LineSegPar),SizeOf(LineSegPar),-1) = LINESEG_OBJ then
  Memo1.Lines.Add(Format('%f;%f - %f;%f',[LineSegPar.x1,LineSegPar.y1,LineSegPar.x2,LineSegPar.y2]));


Та же ошибка: «Размер структуры параметров не соответствует указанному» ::)


Slaviation

LineSegPar сначала нужно получить с помощью GetParamStruct а уже потом использовать в GetObjParam

AndreyE13

При использовании автоматизации — да, но в новом API это либо делается как-то иначе, либо не делается вообще.
Строка
LineSegPar:=LineSegParam(Kompas.GetParamStruct(ko_LineSegParam));
приводит к ошибке. В документации речь именно о ks*.

В примере, который по ссылке, тоже старый API. Вот и бьюсь в непонятках :shu: