Изменение UCS через прозрачные команды.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение UCS через прозрачные команды.

Изменение UCS через прозрачные команды.

Ответ
Поиск в этой теме
Непрочитано 16.10.2007, 14:14 #1
Изменение UCS через прозрачные команды.
kosmi
 
Регистрация: 16.10.2007
Сообщений: 30

Добрый день!
Безуспешно пытаюсь реализовать следующее:
чертится отрезок с помощью _LINE, далее не выходя из команды с помощью прозрачной команды UCS поворачивается вокруг одной из осей и черчение отрезков продолжается из ПОСЛЕДНЕЙ УКАЗАННОЙ точки, т.е. цепочка не прерывается.
Где-то в дебрях аналогичных форумов почерпнуто следующее:

1. Создаем функцию "World UCS":
(defun UCS_Wd ()
(setq
MyDwg (vla-get-ActiveDocument (vlax-get-acad-object))
MyUCS (vla-get-ActiveUCS MyDwg)
)
(vla-put-XVector MyUCS (vlax-3d-point '(1.0 0.0 0.0)))
(vla-put-YVector MyUCS (vlax-3d-point '(0.0 1.0 0.0)))
(vla-put-origin MyUCS (vlax-3d-point '(0.0 0.0 0.0)))
(vla-put-ActiveUCS MyDwg MyUCS))

2. Создаем, к примеру, "Right UCS":
(defun UCS_Rt ()
(setq MyUCS (vla-get-ActiveUCS MyDwg))
(vla-put-XVector MyUCS (vlax-3d-point (trans '(0.0 1.0 0.0) 1 0)))
(vla-put-YVector MyUCS (vlax-3d-point (trans '(0.0 0.0 1.0) 1 0)))
(vla-put-origin MyUCS (vlax-3d-point (trans '(0.0 0.0 0.0) 1 0)))
(vla-put-ActiveUCS MyDwg MyUCS))

3. Регистрируем функции как прозрачные
(vlax-add-cmd "UCS_Wd" 'UCS_Wd "UCS_Wd" 1)
(vlax-add-cmd "UCS_Rt" 'UCS_Rt "UCS_Rt" 1)

С этим всё ясно, всё работает, за исключением того, что при переключении UCS_Wd --> UCS_Rt последняя указанная точка меняет координаты. Как лечить?
Просмотров: 3985
 
Непрочитано 16.10.2007, 19:40
#2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Через ... одно место
Пробуй так
Код:
[Выделить все]
(defun UCS_Wd ( / MyDwg ucs pt)
(setq MyDwg (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (setq ucs (tblobjname "ucs" "MyWdUCS"))
  (setq ucs (vlax-ename->vla-object ucs))
(setq ucs (vla-add
			(vla-get-UserCoordinateSystems MyDwg)
			(vlax-3d-point '(0.0 0.0 0.0))
			(vlax-3d-point '(1.0 0.0 0.0))
			(vlax-3d-point '(0.0 1.0 0.0))
			"MyWdUCS"
		      )
      )
  )
  (setq pt (trans (getvar "lastpoint") 1 0))
  (vla-put-activeUCS MyDwg ucs)
   (vla-SendCommand MyDwg "_U\n")
  (setvar "lastpoint" (trans pt 0 1))
  )


(defun UCS_Rt ( / MyDwg ucs pt)
(setq MyDwg (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (setq ucs (tblobjname "ucs" "MyRtUCS"))
  (setq ucs (vlax-ename->vla-object ucs))
(setq ucs (vla-add
			(vla-get-UserCoordinateSystems MyDwg)
			(vlax-3d-point '(0.0 0.0 0.0))
			(vlax-3d-point '(0.0 1.0 0.0))
			(vlax-3d-point '(0.0 0.0 1.0))
			"MyRtUCS"
		      )
      )
  )
  (setq pt (trans (getvar "lastpoint") 1 0))
  (vla-put-activeUCS MyDwg ucs)
  (vla-SendCommand MyDwg "_U\n")
  (setvar "lastpoint" (trans pt 0 1))
  )
  

(vlax-add-cmd "UCS_Wd" 'UCS_Wd "UCS_Wd" 1)
(vlax-add-cmd "UCS_Rt" 'UCS_Rt "UCS_Rt" 1)
VVA вне форума  
 
Автор темы   Непрочитано 17.10.2007, 09:55
#3
kosmi


 
Регистрация: 16.10.2007
Сообщений: 30


К моему глубокому сожалению, уважаемый VVA, необходимый эффект не достигнут.
При использовании предложенных Вами функций при переключении одной ПСК в другую LASTPOINT "улетает" в сторону, цепочка отрезков разрывается и продолжает строиться уже из другого места.
Похоже я "криво" сформулировал задачу.
Попробую ещё раз:
1. В некой начальной ПСК мы запускаем команду _.LINE (или другую, где запрашивается ввод следующей точки);
2. Строим отрезок из точки PT0 в точку PTx;
3. В точке РТх с клавиши-акселератора активизируем прозрачную команду, которая переносит начало системы координат в РТх и устанавливает некое определённое направление осей координат, к примеру ПСК повёрнута вокруг оси Y на 90 град. относительно своей ориентации в МСК и продолжаем построения отрезков;
4. Далее в некоторой точке РТх' (по мере необходимости) мы снова устанавливаем
желаемую ПСК (устанавливается "прозрачно") с началом координат в этой точке и т.д. до стандартного выхода из команды.
Т.о. получаем 3D-цепочку отрезков (или 3D-полилинию).
Может быть вышеизложенное несколько бестолково представлено, прошу прощения,
я не программист, так, ваяю иногда для собственного употребления и поэтому прошу помочь мне более сведущих товарищей в решении этой задачи.
С уважением.
kosmi вне форума  
 
Непрочитано 17.10.2007, 10:02
#4
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,290


А какова необходимость смены ПСК для каждой новой точки?
Даже так: что мы вообще рисуем и что в итоге должны получить?
И еще: если я правильно понял, то отрезки строятся вручную? Или все-таки программно?
Pilot вне форума  
 
Автор темы   Непрочитано 17.10.2007, 10:13
#5
kosmi


 
Регистрация: 16.10.2007
Сообщений: 30


Уважаемый Pilot, cм. предыдущий пост.
В итоге мы должны получить просто цепочку отрезков (длина их может быть задана в процессе построений стандартно, путём ввода числовых значений с клавиатуры). Т.е.
я пытаюсь строить отрезки (3Д-полилинии) в пространстве, ВИЗУАЛЬНО указывая направление и кон.точку следующего строящегося участка. Примерно так.
kosmi вне форума  
 
Непрочитано 17.10.2007, 11:31
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от kosmi Посмотреть сообщение
В итоге мы должны получить просто цепочку отрезков (длина их может быть задана в процессе построений стандартно, путём ввода числовых значений с клавиатуры). Т.е.
я пытаюсь строить отрезки (3Д-полилинии) в пространстве, ВИЗУАЛЬНО указывая направление и кон.точку следующего строящегося участка. Примерно так.
Задача решается принципиально неверно. Нет необходимости устанавливать ПСК "прозрачно". Все должно делаться в программе. Если уж и надо временно перенести ПСК (это может быть удобно), то она должна "сама прыгнуть". А после ввода точки не забыть вернуться в прежнее место. Пользователю не нужна ПСК сама по себе, ему надо протащить какую-то трассу. А для трассы он знает направления (вперед, нелево-вниз и т.п.), длины или отметки сегментов. Возможно, нужно вообще прицепиться к какому-то объекту.

Должна быть нормальная функция указания точки. В момент запроса очередной точки пользователь должен иметь возможность ввести точку любыми стандартными способами и, опционально, более удобно. Например, визуально указать направление. Но не мучиться с установкой ПСК.

В ruCAD для визуального указания используется специальный "ёжик" (см. рисунок). "Иголки" на нем показывают возможные направления. В редких случаях, когда они не подходит, точка вводится стандартным способом (в том числе со смещениями).
Миниатюры
Нажмите на изображение для увеличения
Название: ru_point_3d.jpg
Просмотров: 83
Размер:	28.8 Кб
ID:	62  
ShaggyDoc вне форума  
 
Непрочитано 17.10.2007, 11:36
#7
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,290


Цитата:
Сообщение от kosmi Посмотреть сообщение
Уважаемый Pilot, cм. предыдущий пост.
В предыдущем посте было несколько туманно написано.

ShaggyDoc дает наиболее правильную методику решения проблемы. имхо.
Pilot вне форума  
 
Непрочитано 17.10.2007, 12:08
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Согдасен с ShaggyDoc. Как пример для LINE
Код:
[Выделить все]
(defun UCS_Wd ( / MyDwg ucs pt)
(setq MyDwg (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (setq ucs (tblobjname "ucs" "MyWdUCS"))
  (setq ucs (vlax-ename->vla-object ucs))
(setq ucs (vla-add
			(vla-get-UserCoordinateSystems MyDwg)
			(vlax-3d-point '(0.0 0.0 0.0))
			(vlax-3d-point '(1.0 0.0 0.0))
			(vlax-3d-point '(0.0 1.0 0.0))
			"MyWdUCS"
		      )
      )
  )
  (setq pt (trans (getvar "lastpoint") 1 0))
  (vla-put-activeUCS MyDwg ucs)
  (setvar "lastpoint" (trans pt 0 1))
  )


(defun UCS_Rt ( / MyDwg ucs pt)
(setq MyDwg (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (setq ucs (tblobjname "ucs" "MyRtUCS"))
  (setq ucs (vlax-ename->vla-object ucs))
(setq ucs (vla-add
			(vla-get-UserCoordinateSystems MyDwg)
			(vlax-3d-point '(0.0 0.0 0.0))
			(vlax-3d-point '(0.0 1.0 0.0))
			(vlax-3d-point '(0.0 0.0 1.0))
			"MyRtUCS"
		      )
      )
  )
  (setq pt (trans (getvar "lastpoint") 1 0))
  (vla-put-activeUCS MyDwg ucs)
  (setvar "lastpoint" (trans pt 0 1))
  )
  
(defun C:MyLine ( / pt1 pt2 U_M)
 (setvar "CMDECHO" 0)
 (setq U_M (getvar "UNDOMARKS"))
(initget 1)
 (setq pt1 (getpoint "\nНачальня точка:" ))
 (initget "ucsRt ucsWd Отмени _ucsRt ucsWd Undo")
 (while (setq pt2 (getpoint pt1 "\nУкажите точку [ucsRt/ucsWd/Отмени] <выход>: "))
   (cond
     ((listp pt2) ;_точка
      (setvar "USERR1" (car (trans pt1 1 0)))
      (setvar "USERR2" (cadr (trans pt1 1 0)))
      (command "_.UNDO" "_M")
      (command "_.LINE" "_none" pt1 "_none" pt2 "")(setq pt1 pt2)
      )
     ((= pt2 "Undo")
      (if (< U_M (getvar "UNDOMARKS"))
        (progn
	   (command "_.UNDO" "_B")
	   (setq pt1 (list (getvar "USERR1") (getvar "USERR2")))
           (setvar "LASTPOINT" (setq pt1 (trans pt1 0 1)))
          )
        (alert "Отменять больше нечего")
        )
      )
     ((= pt2 "ucsRt")(UCS_Rt)(setq pt1 (getvar "LASTPOINT")))
     ((= pt2 "ucsWd")(UCS_wd)(setq pt1 (getvar "LASTPOINT")))
     (t nil)
     )
   (initget "ucsRt ucsWd Отмени _ucsRt ucsWd Undo")
   )
  (princ)
  )
VVA вне форума  
 
Автор темы   Непрочитано 17.10.2007, 12:10
#9
kosmi


 
Регистрация: 16.10.2007
Сообщений: 30


Уважаемые VVA, Pilot и ShaggyDoc!
Я благодарен вам за отклик. С "ёжиком" из ruCAD я познакомился уже ранее на соответствующем сайте, с опциональными вариантами ввода точек при построении трасс тоже (разные программы, типа CADWORX и т.п.).
Но мне так неудобно!!!
Моя "неправильная", с точки зрения классического подхода выполнения подобного рода задач, сущность стремиться решить задачу, как изложено выше. Предположим,
что функции будут не идеальными, не будут возвращать начальную ПСК и т.д., выбор
направления будет несколько ограничен (достаточно 3-х вариантов ПСК), для меня это не проблема, проблема - как универсально пересчитать LASTPOINT при переходе
из одной ПСК в другую. Сам врядли смогу. Или смогу в плюсбесконечности. К сожалению процесс овладения навыками программирования идёт, мягко говоря, туго.
Так что всё-таки прошу сочувствующих попытаться мне помочь.
Возможно в будущем я перебешусь и образумлюсь, и стану как все, и вспомню добрым словом советы мудрых аксакалов...
С уважением.

Последний раз редактировалось kosmi, 17.10.2007 в 12:43.
kosmi вне форума  
 
Автор темы   Непрочитано 19.10.2007, 09:12
#10
kosmi


 
Регистрация: 16.10.2007
Сообщений: 30


Что-то тихо...
Самостоятельно поизвращался пару деньков в поисках решения.
Никаких результатов не добился. Даже сгоряча подумалось о принципиальной невозможности решить эту задачу с помощью Vlisp.
Кто-нибудь подскажите, стоит вообще копать дальше и, если стоит, то в каком напрвлении?
kosmi вне форума  
 
Непрочитано 19.10.2007, 09:50
#11
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от kosmi Посмотреть сообщение
Что-то тихо...
Так пост #8 полностью решает поставленную задачу... Если надо добавлять варианты UCS, то это можно сделать по аналогии.
Alaspher вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение UCS через прозрачные команды.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Я начинаю заниматься программированием LISP (help) mmax LISP 293 24.02.2009 11:18
Прозрачные команды Vova AutoCAD 17 21.06.2006 05:33
Где можно взять основную надпись и рамку для када А4 Taleon AutoCAD 18 17.04.2006 22:24