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

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

Проблема с определением выбора блока и его зеркальной копии

Ответ
Поиск в этой теме
Непрочитано 10.11.2023, 08:04 #1
Проблема с определением выбора блока и его зеркальной копии
Станислав_
 
Регистрация: 05.08.2023
Сообщений: 27

Всем здравствуйте! Сочинил программу по расстановке блоков на плане по заданным трём точкам, причём блоки привязываются к положению отрезка между точками pt1 и pt2, который может не совпадать с направлением оси Х. Расставляемые блоки имеют свои зеркальные копии и поэтому блоки разделяются на Правые и Левые, что определяется по их названию: например, Блок_П (правый блок) и Блок_Л (левый блок). Для выбора левого или правого блока сделал код, который привожу ниже:

Код:
[Выделить все]
 (setq ang_ (angle pt1 pt2))
	      (cond
                ((equal ang_ 0 0.000000001)  ;если угол между осью Х и отрезком между точками pt1 и pt2 равен 0, то
                 (cond
                   ((> (cadr pt2)(cadr pt3)) (setq bl_nm (VL-STRING-SUBST "П" "Л" bl_nm 3)))  ;Правый блок
                   ((< (cadr pt2)(cadr pt3)) (setq bl_nm (VL-STRING-SUBST "Л" "П" bl_nm 3)))  ;Левый блок
                 )
                )
                ((equal ang_ pi 0.000000001)  ;если угол между осью Х и отрезком между точками pt1 и pt2 равен pi, то
                 (cond
                   ((> (cadr pt2)(cadr pt3)) (setq bl_nm (VL-STRING-SUBST "Л" "П" bl_nm 3)))  ;Левый блок
                   ((< (cadr pt2)(cadr pt3)) (setq bl_nm (VL-STRING-SUBST "П" "Л" bl_nm 3)))  ;Правый блок
                 )
                )
                ((<= ang_ pi)  ;если угол между осью Х и отрезком между точками pt1 и pt2 меньше либо равен pi, то
                 (cond
                   ((>= (car pt2)(car pt3)) (setq bl_nm (VL-STRING-SUBST "Л" "П" bl_nm 3)))   ;Левый блок
                   ((<= (car pt2)(car pt3)) (setq bl_nm (VL-STRING-SUBST "П" "Л" bl_nm 3)))   ;Правый блок
                 )
                )
                ((> ang_ pi)  ;если угол между осью Х и отрезком между точками pt1 и pt2 больше pi, то
                 (cond
                   ((> (car pt2)(car pt3)) (setq bl_nm (VL-STRING-SUBST "П" "Л" bl_nm 3)))    ;Правый блок
                   ((< (car pt2)(car pt3)) (setq bl_nm (VL-STRING-SUBST "Л" "П" bl_nm 3)))    ;Левый блок
                 )
                )
              )
После определения модификации блока (Л или П), он вставляется из базы через vla-InsertBlock.
Во время работы программы при установке блока в горизонтальном положении блок по данному коду может быть выбран неверно. Число неверных выборов при расстановке на одном плане в один горизонтальный ряд небольшое, но есть!
Прошу совета у знающих людей, как исправить код или подсказать, есть ли другой способ определения Левый-Правый, отличный от моего. Заранее всех благодарю за ответы!
Просмотров: 1096
 
Непрочитано 10.11.2023, 08:09
#2
Кулик Алексей aka kpblc
Moderator

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


А там точно угол поворота, а не зеркалирование (масштаб по оси Х, к примеру, равен -1) ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.11.2023, 09:13
#3
Станислав_


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


Не зеркалирование. Блоки вставляются каждый из своего файла, Левый из одного, Правый из другого.
Станислав_ вне форума  
 
Непрочитано 10.11.2023, 11:33
#4
koMon


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


Цитата:
Сообщение от Станислав_ Посмотреть сообщение
другой способ определения Левый-Правый
умножение векторов
Код:
[Выделить все]
 
(defun vector_multiplying (line_1 line_2 / x1 y1 z1 x2 y2 z2)
  	(mapcar 'set '(x1 y1 z1) (mapcar '- (cadr line_1) (car line_1)))
  	(mapcar 'set '(x2 y2 z2) (mapcar '- (cadr line_2) (car line_2)))
	(if (minusp (caddr (list (- (* y1 z2) (* z1 y2))
		      				 (- (* z1 x2) (* x1 z2))
		      				 (- (* x1 y2) (* y1 x2))
					   )
				)
		)
		"П" "Л"
	)
)
(setq pt1 (getpoint "\nТочка 1: ")
	  pt2 (getpoint pt1 "\nТочка 2: ")
	  pt3 (getpoint pt2 "\nТочка 3: ")
	  ang_ (angle pt1 pt2) 
	  line_1 (list pt1 pt2)
	  line_2 (list pt2 pt3)
	  block_direction (vector_multiplying line_1 line_2)
	  bl_nm (cond 
				((= "П" block_direction) (vl-string-subst block_direction "Л" bl_nm 3))
				((= "Л" block_direction) (vl-string-subst block_direction "П" bl_nm 3))
			)
)
__________________
K Lisp

Последний раз редактировалось koMon, 10.11.2023 в 13:01.
koMon вне форума  
 
Автор темы   Непрочитано 10.11.2023, 11:51
#5
Станислав_


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


koMon, спасибо! Вечером попробую.
Станислав_ вне форума  
 
Автор темы   Непрочитано 10.11.2023, 19:34
#6
Станислав_


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


koMon, ещё раз огромное спасибо! Совсем забыл, что есть векторная алгебра!
Станислав_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Проблема с определением выбора блока и его зеркальной копии



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дренаж или гидроизоляция. Проблема выбора решения... Gar_ Основания и фундаменты 27 19.10.2018 21:19
Проблема с выбором блока из палитры SID91 AutoCAD 3 24.11.2017 08:42
Как выставить точку вставки динамического блока на курсор? Preparat Динамические блоки 4 03.12.2016 10:46
Проблема выбора исполнителя работ по замене дымовой трубы. Хочу услышать мнение опытных людей. СеРый Технология и организация строительства 38 02.03.2013 02:43
Проблема со вставкой блока Autocad2006 V0vik AutoCAD 2 01.09.2006 10:16