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

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

Нужна помощь с кодом лиспа по превращению текста/мтекста в мультивыноску

Ответ
Поиск в этой теме
Непрочитано 09.10.2022, 13:22 #1
Нужна помощь с кодом лиспа по превращению текста/мтекста в мультивыноску
gunjubasich
 
Регистрация: 09.10.2022
Сообщений: 3

Код:
[Выделить все]
;;; By RonJon
;;; Found at http://www.cadtutor.net/forum/showthread.php?41822-changing-text-mtext-to-multileaders...
(defun c:am (/ newleader pt1 pt2 ss txt x w rjp-getbbwdth)
  (vl-load-com)
  (defun rjp-getbbwdth (obj / out ll ur)
    (vla-getboundingbox obj 'll 'ur)
    (setq out (mapcar 'vlax-safearray->list (list ll ur)))
    (distance (car out) (list (caadr out) (cadar out)))
  )
  (if (setq ss (ssget '((0 . "*TEXT"))))
    (progn (setq txt (apply
		       'strcat
		       (mapcar
			 'cdr
			 (vl-sort
			   (mapcar '(lambda (x)
				      (cons (vlax-get x 'insertionpoint)
					    (strcat (vlax-get x 'textstring) " ")
				      )
				    )
				   (setq
				     ss	(mapcar
					  'vlax-ename->vla-object
					  (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
					)
				   )
			   )
			   (function (lambda (y1 y2) (< (cadr (car y2)) (cadr (car y1))))
			   )
			 )
		       )
		     )
		 w   (car (vl-sort (mapcar 'rjp-getbbwdth ss) '>))
		 txt (apply 'strcat
			    (mapcar 'chr (reverse (cdr (reverse (vl-string->list txt)))))
		     )
	   )
	   (mapcar 'vla-delete ss)
    )
  )
  (if (and (setq pt1 (getpoint "\nSpecify leader arrowhead location: "))
	   (setq pt2 (getpoint pt1 "\nSpecify landing location: "))
      )
    (progn (command ".MLEADER" pt1 pt2 "")
	   (setq newleader (vlax-ename->vla-object (entlast)))
	   (vla-put-textstring newleader txt)
	   (vla-put-textwidth newleader w)
    )
  )
  (princ)
)
Лисп превращает текст\мтекст в мультивыноску, но перед превращением он спрашивает откуда будет начинаться выноска, и второе - где будет сама полка.
Я хочу изменить лисп так чтобы вместо первого действия он брал исходную точку например мтекста(Приложу скриншот) и брал начало от неё, а второе действие оставить без изменений, полку я буду выбирать сам.

Я не силен пока еще в програмировании, но полагаю что нужны изменения в строке (if (and (setq pt1 (getpoint "\nSpecify leader arrowhead location: ")) и вставить туда функцию GetBoundingCenter

----- добавлено через ~6 ч. -----
так. я понял что нет такой функции как GetBoundingCenter, и теперь я в еще большем тупике. Оказывается GetBoundingCenter я увидел это в другом лиспе и подумал что это поможет как-то мне)

Миниатюры
Нажмите на изображение для увеличения
Название: 2022-10-09_01-01-20.png
Просмотров: 46
Размер:	36.7 Кб
ID:	250386  

Просмотров: 3035
 
Непрочитано 09.10.2022, 19:27
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,050


Есть GetBoundingBox, а GetBoundingCenter - это, видимо, что-то пользовательское на базе предыдущего метода.
Сергей812 вне форума  
 
Непрочитано 12.10.2022, 08:21
#3
name02


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


Твой лисп работает так: если несколько TEXT и MTEXT объектов он "сшивает" их в один. Далее указываешь точку откуда выноска и затем точку начала полки выноски.
Соответственно вопрос - если ты хочешь чтобы автоматически бралась точка вставки текста, то что принять за нее если несколько объектов?
name02 вне форума  
 
Автор темы   Непрочитано 12.10.2022, 21:06
#4
gunjubasich


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


Цитата:
Сообщение от name02 Посмотреть сообщение
Соответственно вопрос - если ты хочешь чтобы автоматически бралась точка вставки текста, то что принять за нее если несколько объектов?
Не так. Суть такая, по порядку будем идти.
Есть вхождение блока с атрибутом (кадастровый номер).
1. Я лиспом "АTTMT" вытаскиваю атрибуты наружу в виде МТЕКСТа
2. Хочу чтобы лисп из первого поста после выбора текста автоматически брал точку вставки стрелки, а точку начала полки я выбираю сам.

Ниже в видео я показал , пусть и сплохим качеством от какой точки опираться. Центр вхождения блока и точка текста совпадают. Вот от неё и хочется строить выноску.
https://disk.yandex.ru/i/OXiALar_StgyRg
Лисп который вытаскивает атрибуты прилагаю
Код:
[Выделить все]
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
:;;;; written by Smirnoff
;;;;; found @ http://www.cadtutor.net/forum/showthread.php?56833-Display-ATTRIBUTES-as-Text-from-multiple-blocks&highlight=attmt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:attmt(/ aDoc aSp oSiz bSet aLst cLst tStr nTxt bCtr Tags TextInsert)

  ; *****************************************************************************
  ;                                  ADJUSTMENTS                                ;
  ;                 (Modify it to adjust for your own requirements)             ;
  ; *****************************************************************************

  (setq Tags T) 	; - if T add tags to MText if Nil not
  
  (setq TextInsert T)	; - Text insertion point. If T center of Bounding Box 
  			;   of block, if Nil Block insertion point.

  ; ******************************* END ADJUSTMENTS *****************************

  (vl-load-com)

  (defun GetBoundingCenter (vlaObj / blPt trPt cnPt)
    (vla-GetBoundingBox vlaObj 'minPt 'maxPt)
    (setq blPt(vlax-safearray->list minPt)
	  trPt(vlax-safearray->list maxPt)
	  cnPt(vlax-3D-point
		 (list
		   (+(car blPt)(/(-(car trPt)(car blPt))2))
		   (+(cadr blPt)(/(-(cadr trPt)(cadr blPt))2))
		   0.0
		 ); end list
	       ); end vlax-3D-point
    ); end setq
  ); end of GetBoundingCenter

  (if(not attmt:Size)(setq attmt:Size(getvar "TEXTSIZE")))
  (setq oSiz attmt:Size
	attmt:Size(getreal(strcat "\nText size <"(rtos attmt:Size)">: ")))
  (if(null attmt:Size)(setq attmt:Size oSiz))
  (setq aDoc(vla-get-ActiveDocument(vlax-get-acad-object)))
  (if(= 1(vla-get-ActiveSpace aDoc))
    (setq aSp(vla-get-ModelSpace aDoc))
    (setq aSp(vla-get-PaperSpace aDoc))
    ); end if
  
  (princ "\n<<< Select text to extract attributes to MText >>> ")
  (if(setq bSet(ssget '((0 . "INSERT"))))
    (progn
    (foreach b(mapcar 'vlax-ename->vla-object
			 (vl-remove-if 'listp
			   (mapcar 'cadr(ssnamex bSet))))
      (setq aLst '()
	    tStr "") ; end setq
      (if TextInsert
	  (setq bCtr(GetBoundingCenter b))
	  (setq bCtr(vla-get-InsertionPoint b))
	); end if
       (if(= :vlax-true(vla-get-HasAttributes b))
	 (progn
	    (setq aLst
		   (mapcar '(lambda (a)
			      (list (vla-get-TagString a)
				    (vla-get-TextString a)))
			   (vlax-safearray->list
			     (vlax-variant-value(vla-GetAttributes b)))))
	     (foreach i(reverse aLst)
	       (setq tStr(strcat tStr(if Tags(strcat(car i) ": ")"")(last i)"\\P"))
	       ); end foreach
	   (if(/= "" tStr)
	     (progn
	      (setq nTxt(vla-AddMText aSp bCtr (* attmt:Size 30.0) tStr))
	      (vla-put-Height nTxt attmt:Size)
	     ); end progn
	     ); end if
	   ); end progn
	 ); end if
      ); end foreach
    (vla-EndUndoMark aDoc)
     ); end progn
    ); end if
  (princ)
  ); end of c:attmt
А ну и еще , работать приходится в нанокаде.
gunjubasich вне форума  
 
Автор темы   Непрочитано 18.10.2022, 21:05
#5
gunjubasich


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


т.е. например есть условная команда (command "_mleader" pointA pointB ) , как сделать так чтобы координата pointA брала insertionpoint мтекста? а pointB я хочу указывать вручную
gunjubasich вне форума  
 
Непрочитано 18.10.2022, 22:17
1 | #6
Кулик Алексей aka kpblc
Moderator

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


Offtop: Я бы не делал ставку на командное создание мультивыноски...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужна помощь с кодом лиспа по превращению текста/мтекста в мультивыноску

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь в разработке чертежей дужки проходческой бадьи Юлия инженер Машиностроение 8 29.10.2017 04:26
Нужна помощь в определении марки ж.б. балки ksv_2011 Поиск литературы, чертежей, моделей и прочих материалов 0 24.09.2017 17:24
Нужна помощь по изменению лиспа "Вставка пикетажа" в лисп "вставка плюсовой точки" sosococo LISP 8 27.01.2016 13:36
Нужна помощь по Archicad 12 штриховка Artmen ArchiCAD 10 11.01.2014 13:51