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

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

Как написать лисп для замены координат точек?

Ответ
Поиск в этой теме
Непрочитано 05.12.2019, 11:11 #1
Как написать лисп для замены координат точек?
A.Gonchy
 
Регистрация: 05.12.2019
Сообщений: 2

Столкнулся с проблемой: необходимо заменить в выбранной области координаты точек (менять местами будем значения оси Y и оси Z в мировой системе координат.
Т.е. необходимо добиться того, чтобы лисп сам определял точки в выбранной области и сам у них менял координаты Y и Z местами, дабы не делать это каждый раз вручную. Не смог пока понять, каким кодом это можно осуществить.
Просмотров: 1850
 
Непрочитано 05.12.2019, 11:58
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,051


http://help.autodesk.com/view/ACD/20...8-6F3DE5F506BA
trir вне форума  
 
Непрочитано 05.12.2019, 13:47
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833


trir, скорее уж http://help.autodesk.com/view/ACD/20...8C58F4C832.htm
A.Gonchy, что сделано самостоятельно, где код, где споткнулся?
Если кода нет, то алгоритм:
- запрос у пользователя - выбор точек (см. ssget, ее параметры и фильтры)
- пройтись по набору, для каждой точки меняя ее координаты как надо (тот же самый entmod, к примеру). Преобразование набора примитивов в список на форуме несколько раз мелькало.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.12.2019, 10:50
#4
A.Gonchy


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


Код:
[Выделить все]
 (defun c:wall (/)
  (initget 1 "Северную Южную Западную Восточную")
  (setq	x (getkword
	    "Развернуть стенку [Северную/Южную/Западную/Восточную]: "
	  )
  )
  (if (= x "Северную")
    (c:--WALL)
  )
  (if (= x "Южную")
    (c:YUG)
  )
  (if (= x "Восточную")
    (c:ZAP)
  )
  (if (= x "Западную")
    (c:VOS)
  )
  (defun c:--WALL (/)
    (setvar "cmdecho" 0)
    (setq NaborPoint (ssget '((0 . "POINT"))))
    (if	(= NaborPoint nil)
      (progn (alert "Точки не найдены!\rПОворот стенок") (exit))
    )
    (command "_.undo" "_begin")
    (setq osmodeOLD (getvar "osmode"))
    (setvar "osmode" 0)
    (setq I 0)
    (repeat (sslength NaborPoint)
      (setq PrimitivPointOld (ssname NaborPoint I))
      (setq XYZpointOld (cdr (assoc 10 (entget PrimitivPointOld))))
      (setq XYZpointNew
	     (list (car XYZpointOld)
		   (caddr XYZpointOld)
		   (cadr XYZpointOld)
	     )
      )
      (command "_.point" XYZpointNew)
      (setq I (1+ I))
      (print I)
    )
    (setq I 0)
    (repeat (sslength NaborPoint)
      (setq PrimitivPointOld (ssname NaborPoint I))
      (command "_.erase" PrimitivPointOld "")
      (setq I (1+ I))
      (print I)
    )
    (setvar "osmode" osmodeOLD)
    (command "_.regen")
    (command "_.undo" "_end")
    (princ)
  )
  (prompt "\nПоворот стенок")
(princ)

  (defun c:YUG ()
  (setq bazovaya '(1000 1000 0))
  (setq ugol 180)
  (command "_.ROTATE" "_ALL" "" bazovaya ugol)
  (command "_.ZOOM" "Г" "")
  (c:--WALL)
)


(defun c:ZAP ()
  (setq bazovaya '(1000 1000 0))
  (setq ugol 270)
  (command "_.ROTATE" "_ALL" "" bazovaya ugol)
  (command "_.ZOOM" "Г" "")
  (c:--WALL)
)


(defun c:VOS ()
  (setq bazovaya '(1000 1000 0))
  (setq ugol 90)
  (command "_.ROTATE" "_ALL" "" bazovaya ugol)
  (command "_.ZOOM" "Г" "")
  (c:--WALL)
)
)
Вот код, он должен предлагать сначала вариант, потом выполнять действие, в зависимости от выбранного варианта, но он не работает, не могу понять, почему
A.Gonchy вне форума  
 
Непрочитано 07.12.2019, 06:45
#5
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Y на Z
Код:
[Выделить все]
 (defun c:SubstPointYZ (/ ss pr x y z)
	(if (setq ss (ssget '((0 . "POINT"))))
	  (foreach entity (ssnamex ss)
	    (if (eq (type (cadr entity)) 'ENAME)
	      (progn
		(setq pr (entget (cadr entity))
		      x (nth 1 (assoc 10 Pr))
		      y (nth 2 (assoc 10 Pr))
		      z (nth 3 (assoc 10 Pr))
		      pr (subst (cons 10 (list x z y)) (assoc 10 Pr) Pr)
		 );setq
	      (entmod pr)
		);progn
	      );if
	    );foreach
	  );if
  );defun
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 09.12.2019, 10:20
#6
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,679


если менять в мск, то правильнее применять ActiveX.
без учёта elevation.

Код:
[Выделить все]
 
;****************************************************************************************************************************************

(defun swap_point_coordinates (direction / points_sset_object dxf_group_code dxf_filter_data)
    (setq points_sset_object (vla-Add
							(vla-get-SelectionSets (vla-get-ActiveDocument (vlax-get-acad-object)))
							(vl-filename-base (vl-filename-mktemp))
					  )
	)
    (vla-SelectOnScreen
		points_sset_object
		(progn
			(vlax-safearray-put-element (setq dxf_group_code (vlax-make-safearray vlax-vbinteger '(0 . 0))) 0 0)
			dxf_group_code
		)
		(progn
			(vlax-safearray-put-element (setq dxf_filter_data (vlax-make-safearray vlax-vbvariant '(0 . 0))) 0 "Point")
			dxf_filter_data
		)
	)
	(if (not (zerop (vla-get-count points_sset_object)))
		(vlax-map-collection
			points_sset_object
			'(lambda (selected_point)
				(cond
					(
						(or (= "XY" (strcase direction))
							(= "YX" (strcase direction))
						)
							(vla-put-coordinates selected_point (vlax-3d-point (list (cadr (vlax-get selected_point 'coordinates))
																					  (car (vlax-get selected_point 'coordinates))
																					  (caddr (vlax-get selected_point 'coordinates))
																				)
																 )
							)
					)
					(
						(or
							(= "XZ" (strcase direction))
							(= "ZX" (strcase direction))
						)
							(vla-put-coordinates selected_point (vlax-3d-point (list (caddr (vlax-get selected_point 'coordinates))
																					  (cadr (vlax-get selected_point 'coordinates))
																					  (car (vlax-get selected_point 'coordinates))
																				)
																 )
							)
					)
					(
						(or
							(= "YZ" (strcase direction))
							(= "ZY" (strcase direction))
						)
							(vla-put-coordinates selected_point (vlax-3d-point (list (car (vlax-get selected_point 'coordinates))
																					  (caddr (vlax-get selected_point 'coordinates))
																					  (cadr (vlax-get selected_point 'coordinates))
																				)
																 )
							)
					)
				)
			 )
		)
		(princ "\nТочки не выбраны")
	)
    (vla-Delete points_sset_object)
	(vlax-release-object points_sset_object)
	(princ)
)

;****************************************************************************************************************************************

(swap_point_coordinates "xy")
(swap_point_coordinates "xz")
(swap_point_coordinates "yz")

;****************************************************************************************************************************************
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как написать лисп для замены координат точек?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Проблемы с построением полилиний по номерам точек COGO Stoner Программирование 11 01.06.2015 19:33
помогите написать лисп определения площади и объема dew LISP 11 16.01.2012 10:35
Как написать программу нанесения точек на план участка? FOXAL Программирование 18 23.05.2011 14:53
управление системой координат Автокад из Делфей Владимир В Программирование 12 27.04.2005 09:54