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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите объединить две lisp-функции в одну

Помогите объединить две lisp-функции в одну

Ответ
Поиск в этой теме
Непрочитано 06.02.2017, 19:40 #1
Помогите объединить две lisp-функции в одну
pant-79
 
Регистрация: 27.07.2013
Сообщений: 7

Всем привет. Сами мы не местные сам я в lisp-е не силен, и если буду силен, то не скоро.
Как тут любят говорить, мой мозг безвозвратно изуродован VBA.
Собственно, и стараюсь все писать на VBA, т.к. в нем я еще на Excel-е собаку съел.
Но тут потребовалось решение следующей задачи: Программным способом выгнать на PaperSpace выноску (mleader), в тексте которой должны быть указаны значения атрибутов динамического блока, лежащего в ModelSpace. То есть, банально через вьюпорт тыкаем по блоку и в пространстве листа появляется выноска с его атрибутами.
На VBA все это реализовать не получилось, потому что там команда TranslateCoordinates работает через пень-колоду и выноска улетает в неправильные координаты.
На Lispe у меня есть две функции:
Первая рождена в муках мною лично:
Код:
[Выделить все]
 (DEFUN c:smlead	(/ Obj Coord Attrs Name pt1 p1 p2)
  (command "_.MSPACE")
  (setq Obj (entsel "\nУкажите маркируемый объект : "))
  (setq Coord (nth 1 Obj))
  (setq Name (cdr (assoc 2 (entget (nth 0 Obj)))))
  (setq pt1 (trans (trans Coord 0 2) 2 3))
  (command "_.PSPACE")
  (setq p1 (trans pt1 0 2))
  (setq p2 (polar p1 (/ pi 4) 20))
  (vl-cmdf "_mleader" p1 p2 Name)
)
Она правильно выгоняет выноску, но в содержимое пихает только имя блока (причем, не совсем то, которое нужно).
Вторую нарыл здесь:
Код:
[Выделить все]
 (defun get-all-atts (obj)
    ;;;Use (get-all-atts (car(entsel "\nSelect block:")))
    ;;;Returs list  (("TAG1" . "Value1")("TAG2" . "Value2") ...)
(vl-load-com)
    (if (= (type obj) 'ENAME)
		(setq obj (vlax-ename->vla-object obj)))
  (if (and obj
           (vlax-property-available-p obj 'Hasattributes)
	   (eq :vlax-true (vla-get-HasAttributes obj))
      )
    (vl-catch-all-apply
      (function
	(lambda	()
	  (mapcar (function (lambda (x)
			      (cons (vla-get-TagString x)
				    (vla-get-TextString x)
			      )
			    )
		  )
		  (append (vlax-invoke obj 'Getattributes)
			  (vlax-invoke obj 'Getconstantattributes)
		  )
	  )
	)
      )
    )
  )
)
Она выгоняет атрибуты блока в малопонятный для меня массив. Но это еще половина беды. Главное, что я не смог ее присобачить к первой функции в силу моего незнания лиспа, хотя пытался неоднократно.
Вот, теперь прошу помощи у местных гуру. Как их объединить?
Просмотров: 1474
 
Непрочитано 07.02.2017, 17:09
#2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


pant-79,
Цитата:
Сообщение от pant-79 Посмотреть сообщение
значения атрибутов динамического блока
Всех? Приложи пример с динамическим блоком, вьюпортом и выноской как должна быть
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 07.02.2017, 18:44
#3
pant-79


 
Регистрация: 27.07.2013
Сообщений: 7
Отправить сообщение для pant-79 с помощью Skype™


Ну, не все, а какие нужно. Тут же главное суть понять, а потом уже можно будет в (if (= vla-get-TagString "что-то свое")) запихать.
Пример во вложении.
Вложения
Тип файла: dwg
DWG 2013
Пример.dwg (89.8 Кб, 19 просмотров)
pant-79 вне форума  
 
Непрочитано 07.02.2017, 20:08
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Держи
Код:
[Выделить все]
(DEFUN c:smlead	(/ Obj Coord Attrs Name txt pt1 p1 p2)
  (vl-load-com)
  (command "_.MSPACE")
  (setq Obj (entsel "\nУкажите маркируемый объект : "))
  (setq Coord (nth 1 Obj))
  (setq pt1 (trans (trans Coord 0 2) 2 3))
  (command "_.PSPACE")
  (setq Attrs (get-all-atts(vlax-ename->vla-object (car Obj))))
  (setq txt (strcat
	      (cdr(assoc "НАИМЕНОВАНИЕ" Attrs))
	      " "
	      (cdr(assoc "ТИП" Attrs))
	      "\\PL="
	      (cdr(assoc "РАСХОД" Attrs))
	      "мм"
	      )
	)
  (setq p1 (trans pt1 0 2))
  (setq p2 (polar p1 (/ pi 4) 20))
  (vl-cmdf "_mleader" p1 p2 txt)
)

(defun get-all-atts (obj)
    ;;;Use (get-all-atts (car(entsel "\nSelect block:")))
    ;;;Returs list  (("TAG1" . "Value1")("TAG2" . "Value2") ...)
(vl-load-com)
    (if (= (type obj) 'ENAME)
		(setq obj (vlax-ename->vla-object obj)))
  (if (and obj
           (vlax-property-available-p obj 'Hasattributes)
	   (eq :vlax-true (vla-get-HasAttributes obj))
      )
    (vl-catch-all-apply
      (function
	(lambda	()
	  (mapcar (function (lambda (x)
			      (cons (vla-get-TagString x)
				    (vla-get-TextString x)
			      )
			    )
		  )
		  (append (vlax-invoke obj 'Getattributes)
			  (vlax-invoke obj 'Getconstantattributes)
		  )
	  )
	)
      )
    )
  )
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 07.02.2017, 20:50
#5
pant-79


 
Регистрация: 27.07.2013
Сообщений: 7
Отправить сообщение для pant-79 с помощью Skype™


Спасибо огромное!!! То, что нужно!!
pant-79 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите объединить две lisp-функции в одну

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив лучей по заданной логической функции в lisp Kototim LISP 12 04.12.2015 10:02
Помогите объединить команду полилиния с конточкой? Григорьев Виктор Программирование 4 03.02.2012 15:15
Как опустить все линии на одну плоскость. Простой вопрос. Помогите! lbmoney AutoCAD 4 05.12.2011 10:47
Как не выводить в командную строку результат выполнения функции (lisp)? Иванов Дмитрий LISP 6 28.11.2010 17:54
Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок. Pastor LISP 16 17.11.2010 13:15