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

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

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

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

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

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

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

Как сдвинуть фантом в 2D процессе

Автор A.n.d.r.e.w, 18.10.24, 11:22:19

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

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

A.n.d.r.e.w

Привет форум.
Создаю динамический процесс в 2д документе, хочу построить макро с помощью нескольких кликов мышкой.
помимо задания положения макро требуется сделать еще несколько кликов для задания доп параметров
поэтому использую процесс типа ksProcess2DCursor
в событии PlacementChanged получаю координаты каждого клика, считаю их, сам определяю положение макро
(при этом фантом должен менять положение) + свои дополнительные параметры (при этом фантом должен менять геометрию)
когда кликов достаточно то создаю макро.
Все хорошо, проблема в динамическом отображении фантома в процессе создания макро.
Фантом у меня пользовательский ksUserPhantom, в его группе я могу рисовать что хочу.
У фантома есть такие свойства как X, Y, Angle. Но не двигается зараза, что бы не делал. Стоит в нуле.
делаю так
 
procParam: IProcessParam;
proc: Iprocess2D;
.......
  //создал параметры процесса
procParam:=newKompasAPI.CreateProcessParam;

  //создал процесс
proc:=(newKompasAPI.ActiveDocument as IKompasDocument2D1).LibProcess[ksProcess2DCursor];
(proc as IProcess).ProcessParam:=procParam;
(proc as IProcess).Dynamic:=true;

  //задал тип фантома
proc.Phantom2D.PhantomType:= ksUserPhantom;

  //запустил процесс
(proc as IProcess).Run(false, false);

  //создал группу фантома
proc.Phantom2D.PhantomGroup:=(newKompasAPI.ActiveDocument as IKompasDocument2D1).DrawingGroups.Add(true, '') ;

  //открыл
proc.Phantom2D.PhantomGroup.Open;
  //порисовал
lineseg(0,0,100,100,1);
  //закрыл
proc.Phantom2D.PhantomGroup.Close;
   
  //обновил фантом
proc.Phantom2D.Update;

  //задал положение фантома
proc.Phantom2D.X:=200;
proc.Phantom2D.Y:=200;
proc.Phantom2D.Angle:=45;

  //обновил процесс
(proc as IProcess).Update;

пока выхожу из положения тем что создаю матрицу преобразования перед рисованием в группе
но не правильно это как то мне кажется.
Почему не двигается фантом?



UU

Событие мыши отслеживать и устанавливать новые координаты по событию.

A.n.d.r.e.w

Цитата: UU от 18.10.24, 11:48:50Событие мыши отслеживать и устанавливать новые координаты по событию.

я так и делаю.
даже кусок кода привел.
что не так?

UU

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

A.n.d.r.e.w

да вопрос не в мыши, а в фантоме.
почему он не сдвигается?
Зачем эти свойства?

proc.Phantom2D.X:=200;
proc.Phantom2D.Y:=200;
proc.Phantom2D.Angle:=45;

если никакой реакции


UU

Какой тип фантома, я его не вижу.
Если не указан, то его нет.
изображение_2024-10-18_124252906.png

A.n.d.r.e.w

Цитата: UU от 18.10.24, 12:42:59Какой тип фантома, я его не вижу.

тип фантома пользовательский
в вопросе указано

proc.Phantom2D.PhantomType:= ksUserPhantom;


UU

Когда рисуете фантом учитывайте Phantom2D.Х, Phantom2D.Y и всё у Вас будет смещаться.

A.n.d.r.e.w

Цитата: UU от 18.10.24, 13:04:51Когда рисуете фантом учитывайте Phantom2D.Х, Phantom2D.Y и всё у Вас будет смещаться.

не понятно что вы имеете ввиду.
Я как раз пытаюсь устанавливать эти свойства рассчитывая что таким образом сдвигаю СК фантома относительно СК вида.
Но что значить учитывать эти свойства?


UU

LineSeg(Phantom2D.Х,Phantom2D.Y,Phantom2D.Х+100,Phantom2D.Y+100,1);
Что тут непонятно?

p3452

Цитата: A.n.d.r.e.w от 18.10.24, 13:26:22не понятно что вы имеете ввиду...
Фантом - это "временная группа".
Чтобы Фантом сместился, нужно ПЕРЕРИСОВАТЬ эту самую "временную группу" по новым координатам.

Посмотрите функцию ShowInsertFragment() в STEP5, там на API5 и вставляется готовый Фрагмент, но "принцип" одинаков.

A.n.d.r.e.w

Да я так и делаю, использую матрицу преобразования перед рисованием в группе
mtr(x, y, a, s)
//рисуем что хотим
deletemtr;
да так работает все понятно..
(я это еще в первом посте написал)

но мне всё же не понятно что это за свойства и нахрена они?
proc.Phantom2D.X
proc.Phantom2D.Y
proc.Phantom2D.Angle

вот например если использовать тип группы ksMoveGroupPhantom
то ничего преобразовывать не надо фантом перемещается в соответствии с
пласементом процесса. т.е. если тип процесса ksProcess2DCursor то
фантом таскается за курсором постоянно

я полагал что при пользовательском типе фантома
я могу менять его положение с помощью этих свойств как контейнер
а в фантоме рисовать не в глобальных координатах а в его локальных
без всякого преобразования так же как в фантоме типа ksMoveGroupPhantom

понятно что временная и понятно что надо перерисовывать я так и делаю
в событии менеджера процесса PlacementChanged получаю новые координаты курсора
при первом клике назначаю как точку вставки макро при втором клике вычисляю угол и задаю поворот макро
при следующих другие параметры..   
но перерисовывать группу не обязательно если она сама не изменилась а изменилось лишь ее положение
точнее положение фантома

мне не нужно решение в обход, я и так знаю и примеры эти уже наизусть выучил
мне нужно понять что это за свойства и какой в них смысл
proc.Phantom2D.X
proc.Phantom2D.Y
proc.Phantom2D.Angle



A.n.d.r.e.w

Цитата: UU от 18.10.24, 14:11:58LineSeg(Phantom2D.Х,Phantom2D.Y,Phantom2D.Х+100,Phantom2D.Y+100,1);
Что тут непонятно?

для пользовательского фантома эти свойства всегда равны нулю

UU

Цитата: A.n.d.r.e.w от 18.10.24, 17:54:15для пользовательского фантома эти свойства всегда равны нулю
Вместо них могут быть координаты мыши.

p3452

Цитата: A.n.d.r.e.w от 18.10.24, 17:26:51я полагал ...
Важнее, то что на ЭТОТ счет "полагает" API !
1. Что такое Process? (Зачем он нужен?)
2. НЕ ИМЕЕТ смысла задавать proc.Phantom2D.Angle, если тип процесса ksProcess2DCursor! (Почему?)
3. Ваш код, ПОЧТИ, рабочий и заработает - если осмыслите первые два вопроса и добавите PhantomGroup и PhantomType.

A.n.d.r.e.w

#15
Цитата: p3452 от 18.10.24, 18:21:17Важнее, то что на ЭТОТ счет "полагает" API !
1. Что такое Process? (Зачем он нужен?)
2. НЕ ИМЕЕТ смысла задавать proc.Phantom2D.Angle, если тип процесса ksProcess2DCursor! (Почему?)
3. Ваш код, ПОЧТИ, рабочий и заработает - если осмыслите первые два вопроса и добавите PhantomGroup и PhantomType.

Вот мои мысли на этот счет:
IProcess.Run запускает ПРОЦЕСС получения от пользователя значений трех переменных X, Y, Ang  описывающих положения чего либо в 2D. Процесс этот в цикле один или два раза просит пользователя ткнуть мышкой в экран или ввести значения в соответствующий контрол/ы
если тип процесса ksProcess2DCursor тогда процесс состоит из одного запроса на клик в котором определяются X и Y на панели свойств при этом имеется один системный контрол типа ksControlEditPoint
если тип процесса ksProcess2DPlacement тогда процесс состоит из двух запросов на клик в первом определяются X и Y во втором Ang на панели свойств при этом имеется уже два системных контрола типа ksControlEditPoint и ksControlEditAngle
После завершения цикла клика/ов процесс должен останавливаться при IProcessParam.AutoReduce=true но что-то с этим свойством не так ибо процесс начинается заново независимо от значения этого свойства прервать процесс можно разными способами.
Фантом же это такая штука которая добавляет в процесс визуальную составляющую. Если процесс динамический то обновление фантома возможно при каждом перемещении курсора, так же как и обработка события менеджера процесса PlacementChanged(x, y, ang: Double; _dynamic: Boolean). Фантом может быть линией окружностью еще чем-то там, но может быть и более сложного вида. Чтобы создать свой фантом нужно натолкать в его группу примитивов каких хочется и тогда во время процесса мы сможем увидеть наш фантом. Для того чтобы создать свой фантом необходимо для него выбрать один из двух типов ksUserPhantom или ksMoveGroupPhantom. Однако поведение фантома в этих двух режимах будет разное.
если тип фантома ksMoveGroupPhantom то достаточно один раз даже до запуска процесса отрисовать группу и мы увидим как этот фантом будет перемещаться за курсором принимая заданное положение X, Y, Ang независимо от типа процесса ksProcess2DCursor или ksProcess2DPlacement разница только в том что в первом случае Ang всегда будет равен нулю.
если тип фантома ksUserPhantom тогда если отрисовать группу один раз и мы увидим как этот фантом будет стоять на одном месте в нулях. Перемещаться за курсором он не будет. Для того чтобы он динамически изменялся нужно в событии PlacementChanged делать это вручную
И я бы согласился с решением которое во всех примерах, перерисовывать каждый раз группу в матрице с новыми X, Y, Ang, но что-то не дает покоя.
Как же тогда фантом двигается в режиме ksMoveGroupPhantom без моей перерисовки? А может я и в режиме ksUserPhantom тоже так смогу? Двигать фантом целяком куда хочу.
ksMoveGroupPhantom  меня не устраивает так как мне нужно самому определять назначение кликов. Мой запрос состоит из более чем двух кликов.
Поэтому я зацикливаюсь в режиме процесса ksProcess2DCursor и когда получу достаточное количество кликов останавливаю процесс или начинаю заново цикл.
Моя логика мне нашептывала что IPhantom2D.X, IPhantom2D.Y, IPhantom2D.Angle это то что нужно. В режиме ksMoveGroupPhantom значения задаются автоматически а в режиме ksUserPhantom я их сам буду задавать и перемещать фантом. Но не тут то было (

p3452

На Востоке есть мудрое изречение - "Не возможно наполнить полный сосуд"...

p/s: Тем, "последователям", которые "набредут" на ЭТУ тему:
1. Задача поставленная ТС абсурдна по своей сути - "рисовать" и тут же "вставлять" через IProcess - маловероятная необходимость.
2. Более ЖИЗНЕННАЯ ситуация - см. STEP5 (ShowInsertFragment()).
3. Но и задача ТС, в принципе, решаема если "соединить" пост №1 и пост № 14, причем, РЕШАЕМА как на API5, так и на API7...

A.n.d.r.e.w

О том что у меня есть решение я написал в перво посте.
Однако хотелось разобраться.
Зачем вот эти свойства так никто и не объяснил.
IPhantom2D.X
IPhantom2D.Y
IPhantom2D.Angle

Модератор

Уважаемые участники форума! Не надо отклонятся от обсуждения темы. Все вопросы касательно правил написания сообщений и личных вознаграждений прошу переносить в личные сообщения и не засорять тему! Спасибо за понимание!😌

feron

#19
Цитата: Модератор от 19.10.24, 13:01:37Уважаемые участники форума! Не надо отклонятся от обсуждения темы. Все вопросы касательно правил написания сообщений и личных вознаграждений прошу переносить в личные сообщения и не засорять тему! Спасибо за понимание!😌

Половина форума как придорожный балаган а вы решили именно эту почистить где гроши за помощь предлагали. Хотя видимо он и не торопился..
Тут три напасти - 1) сделаю сам 2) найду где дешевше 3) уже не надо .