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

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

Как программно узнать координаты отдельных строк Мтекста?

Ответ
Поиск в этой теме
Непрочитано 23.05.2006, 12:57 #1
Как программно узнать координаты отдельных строк Мтекста?
kp+
 
идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095

Как программно узнать координаты отдельных строк многострочнгого текста?
Подскажите, PLS.
Просмотров: 3898
 
Непрочитано 23.05.2006, 13:40
#2
Кулик Алексей aka kpblc
Moderator

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


По-моему, практически нереально. Только если производить построчное создание нового однострочного текста, и для него брать vla-getboundary либо textbox. А для чего надо?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.05.2006, 14:13
#3
_Andre_

механизатор
 
Регистрация: 28.12.2004
Самара
Сообщений: 312
<phrase 1=


В приницпе можно разбить примитив MTEXT командой _explode, затем собрать полученные однострочные тексты и уже из них вытащить координаты, затем однострочные тексты удалить.
_Andre_ вне форума  
 
Непрочитано 23.05.2006, 14:19
#4
Кулик Алексей aka kpblc
Moderator

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


поправка, причем критичная. Возможно, потребуется создание не однострочного, а многострочного текста (для случаев переназначенных шрифтов, назначенных свойств subscript или superscript, дробей и прочего). Соответственно, учитывая, что внутри "переназначенного" участка могут быть переносы строк (которые тоже могут обозначаться 2 вариантами - либо \n, либо \p), надо выполнять приличный анализ исходного текста. А потом уже и думать. Все равно интересно, для чего это надо. И исходные данные в полном объеме тоже требуются.
Если примерность расчетов покатит, то можно подсчитать количество переносов строк в тексте, получить через точки "обрамления" текста и разницу по высоте поделить на (количество переносов - 1). Тоже не универсальное решение, не без недостатков, мягко говоря, но это максимум, что я сейчас могу придумать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.05.2006, 16:04
#5
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Цитата:
Сообщение от kpblc
поправка, причем критичная. Возможно, потребуется создание не однострочного, а многострочного текста (для случаев переназначенных шрифтов, назначенных свойств subscript или superscript, дробей и прочего). Соответственно, учитывая, что внутри "переназначенного" участка могут быть переносы строк (которые тоже могут обозначаться 2 вариантами - либо \n, либо \p), надо выполнять приличный анализ исходного текста. А потом уже и думать. Все равно интересно, для чего это надо. И исходные данные в полном объеме тоже требуются.
Если примерность расчетов покатит, то можно подсчитать количество переносов строк в тексте, получить через точки "обрамления" текста и разницу по высоте поделить на (количество переносов - 1). Тоже не универсальное решение, не без недостатков, мягко говоря, но это максимум, что я сейчас могу придумать.
Зачем это надо - чтобы автоматически поднять полку выноски под первую строку текста. Насчет переназначенных участков - такого добра немного, тут не облом и вручную подредактировать.

Цитата:
Сообщение от _Andre_
В приницпе можно разбить примитив MTEXT командой _explode, затем собрать полученные однострочные тексты и уже из них вытащить координаты, затем однострочные тексты удалить.
Надо будет попробовать. Только как узнать, какой из полученных однострочных текстов был первой строкой?
kp+ вне форума  
 
Непрочитано 23.05.2006, 16:25
#6
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


можно проанализировать свойства
LineSpacingDistance
LineSpacingFactor
LineSpacingStyle
Эдуард вне форума  
 
Непрочитано 23.05.2006, 16:38
#7
Кулик Алексей aka kpblc
Moderator

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


Ох-ох-ох, точно никому не дает покоя эта несчастная многострочная выноска... Держи один из вариантов:
Код:
[Выделить все]
;| Нижние 3 строки можно исключить, если *kpblc-activedoc* определена где-то раньше и указывает на активный документ |;
(setq       *kpblc-activedoc*
       (vla-get-activedocument (vlax-get-acad-object))
      ) ;_ end of setq
;|=============================================================================
*    Функция отрисовки выноски с многострочным текстом. Возвращает vla-указатель
* на созданный объект.
*    Параметры вызова:
*	up-string	верхняя строка выноски. Не может быть nil.
*	low-string	нижняя строка выноски. Может быть nil, "". В таком
*			случае выполняется выноска с 1 строкой.
*	start-point	начальная точка выноски. Не nil.
*	end-point	конечная точка выноски. Не nil.
*    Примеры вызова:
(_kpblc-draw-leader "text1" "text2" (setq start-pt (getpoint)) (getpoint start-pt))
=============================================================================|;
(defun _kpblc-draw-leader (up-string low-string	start-point end-point /	lead_obj
			   ann_obj)
  ;; Прежде всего преобразовываем low-string в строковый вид:
  (if (not low-string)
    (setq low-string "")
    ) ;_ end of if
  ;; Теперь собственно выполнение выноски.
  (setq	ann_obj	 (vla-addmtext
		   (_kpblc-get-active-space-obj)
		   (vlax-3d-point end-point)
		   0			; устанавливается ширина именно 0,
					; для нормального получения полки
		   (if (/= low-string "")
		     (strcat up-string "\\P" low-string)
		     up-string
		     ) ;_ end of if
		   ) ;_ end of vla-AddMText
	lead_obj (vla-addleader
		   (_kpblc-get-active-space-obj)
		   (_kpblc-conv-pointlist-to-variant
		     (apply 'append (list start-point end-point))
		     ) ;_ end of _kpblc-conv-pointlist-to-variant
		   ann_obj
		   aclinewitharrow
		   ) ;_ end of vla-AddLeader
	) ;_ end of setq
  ;; Меняем настройки будущей аннотации:
  (vla-put-height ann_obj (* 2.5 (getvar "dimscale")))
  (vla-put-attachmentpoint
    ann_obj
    ;; Назначая точку выравнивания, будем использовать числовые значения:
    ;; acAttachmentPointBottomLeft	->	7
    ;; acAttachmentPointBottomRight	->	9
    ;; acAttachmentPointMiddleLeft	->	4
    ;; acAttachmentPointMiddleRight	->	6
    (+ 4
       (if (> (car end-point) (car start-point))
					; выноска вправо, точка - влево
	 0
	 2
	 ) ;_ end of if
       (if (/= low-string "")		; нижняя строка есть, выр. - по
					; центру
	 0
	 3
	 ) ;_ end of if
       ) ;_ end of +
    ) ;_ end of vla-put-AttachmentPoint
  (vla-put-insertionpoint ann_obj (vlax-3d-point end-point))

  ;; Теперь модицифируем собственно выноску
  (vla-put-verticaltextposition lead_obj acabove)
  ;; В принципе, строка ниже не требуется - так, для страховки.
  (vla-put-coordinate lead_obj 1 (vlax-3d-point end-point))
  lead_obj
  ) ;_ end of defun

;|=======================================================================================
*    Функция возвращает vla-активное пространство (лист / модель). Напрямую решение ruCAD
* - только переименовано под мои задачи.
*    Параметры вызова:
*	Нет
*    Примеры вызова:
(_kpblc-get-active-space-obj)
=======================================================================================|;
(defun _kpblc-get-active-space-obj ()
  (if (and (zerop (vla-get-activespace *kpblc-activedoc*))
	   (= :vlax-false (vla-get-mspace *kpblc-activedoc*))
	   ) ;_ end of and
    (vla-get-paperspace *kpblc-activedoc*)
    (vla-get-modelspace *kpblc-activedoc*)
    ) ;_ end of if
  ) ;_ end of defun

;|=============================================================================
*    Конвертация списка точек вида ((0.0 0.0 0.0) (10.0 10.0 0.0) ...) в массив
* для передачи в activeX рисование объектов.
*    Параметры вызова:
*	point-list	список точек. Не может быть nil. Точки должны быть
*			одинаковой размерности (только 2Д или только 3Д)
*    Примеры вызова:
(_kpblc-conv-pointlist-to-variant (apply 'append (list '(0.0 0.0 0.0)
	'(10.0 10.0 0.0)))
=============================================================================|;
(defun _kpblc-conv-pointlist-to-variant	(point-list /)
  (vlax-make-variant
    (vlax-safearray-fill
      (vlax-make-safearray
	vlax-vbdouble
	(cons 0 (1- (length point-list)))
	) ;_ end of vlax-make-safearray
      point-list
      ) ;_ end of vlax-safearray-fill
    ) ;_ end of vlax-make-variant
  ) ;_ end of defun

;|=============================================================================
*    Функция модификации указанного бита примитива
*    Параметры вызова:
*	entity	- примитив, полученный через (entsel), (entlast) etc
*	bit	- dxf-код, значение которого надо установить
*	value	- новое значение
*    Примеры вызова:
(_kpblc-ent-modify (entlast) 8 "0")	; перенести последний примитив на слой 0
(_kpblc-ent-modify (entsel) 62 10)	; установить выбранному примитиву цвет 10
*    Возвращаемое значение:
*	примитив с модифицированным dxf-списком. Примитив автоматически
*	перерисовывается.
=============================================================================|;
(defun _kpblc-ent-modify (ent bit value / ent_list old_dxf new_dxf)
  (_kpblc-ent-modify-autoregen ent bit value t)
  ) ;_ end of defun

;|=============================================================================
*    Функция модификации указанного бита примитива
*    Параметры вызова:
*	entity	- примитив, полученный через (entsel), (entlast) etc
*	bit	- dxf-код, значение которого надо установить
*	value	- новое значение
*	regen	- выполнять или нет регенерацию примитива сразу. t/ nil
*    Примеры вызова:
(_kpblc-ent-modify (entlast) 8 "0" t)	; перенести последний примитив на слой 0
(_kpblc-ent-modify (entsel) 62 10 nil)	; установить выбранному примитиву цвет 10
*    Возвращаемое значение:
*	примитив с модифицированным dxf-списком.
=============================================================================|;
(defun _kpblc-ent-modify-autoregen (ent	      bit	value	  ext_regen
				    /	      ent_list	old_dxf	  new_dxf
				    )
  (setq ent (_kpblc-ent-to-ename ent))
  (if (not
	(and
	  (or
	    (= (strcase (cdr (assoc 0 (entget ent))) nil) "STYLE")
	    (= (strcase (cdr (assoc 0 (entget ent))) nil) "DIMSTYLE")
	    (= (strcase (cdr (assoc 0 (entget ent))) nil) "LAYER")
	    ) ;_ end of or 
	  (= bit 100)
	  ) ;_ end of and 
	) ;_ end of not 
    (progn
      (setq ent_list (entget ent)
	    new_dxf  (cons bit
			   (if (and (= bit 62) (= (type value) 'str))
			     (if (= (strcase value) "BYLAYER")
			       256
			       0
			       ) ;_ end of if 
			     value
			     ) ;_ end of if 
			   ) ;_ end of cons 
	    ) ;_ end of setq 
      (if (not (equal new_dxf (setq old_dxf (assoc bit ent_list))))
	(progn
	  (entmod (if old_dxf
		    (subst new_dxf old_dxf ent_list)
		    (append ent_list (list new_dxf))
		    ) ;_ end of if 
		  ) ;_ end of entmod
	  (if ent_regen
	    (entupd ent)
	    (redraw ent)
	    ) ;_ end of if
	  ) ;_ end of progn 
	) ;_ end of if 
      ) ;_ end of progn 
    ) ;_ end of if 
  ent
  ) ;_ end of defun

;|=============================================================================
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*	ent-value	значение, которое надо преобразовать в примитив. Может
*			быть именем примитива, vla-указателем или просто
*			списком, полученным по аналогии с (entget).
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-ent-to-ename (entlast))
(_kpblc-ent-to-ename (vlax-ename->vla-object (entlast)))
=============================================================================|;
(defun _kpblc-ent-to-ename (ent-value)
  (cond
    ((= (type ent-value) 'vla-object) (vlax-vla-object->ename ent-value))
    ((= (type ent-value) 'ename) ent-value)
    ((= (type ent-value) 'list) (cdr (assoc -1 ent-value)))
    (t nil)
    ) ;_ end of cond
  ) ;_ end of defun

;|=============================================================================
*    Заменяет последнюю вершину выносок всего файла на точку вставки аннотации.
* Если аннотации нет (по любым причинам), то выполнение продолжается дальше.
* Также попытка изменения полки.
*    Параметры вызова:
*	ent	имя примитива (выноски), над которым надо выполнять операции.
*		Может быть как ename, так и vla-указателем, так и просто списком.
*		Элементы не выноски не обрабатываются
*    Возвращает vla-указатель на измененный объект.
*    Примеры вызова:
(_kpblc-draw-leader-change-points-by-ent (car (entsel)))
=============================================================================|;
(defun _kpblc-draw-leader-change-points-by-ent (ent / selset item counter)
  (cond
    ((= (type ent) 'ename) (setq ent (vlax-ename->vla-object ent)))
    ((= (type ent) 'list)
     (if (assoc -1 ent)
       (setq ent (vlax-ename->vla-object (cdr (assoc -1 ent))))
       (setq ent nil)
       ) ;_ end of if
     )
    ) ;_ end of cond
  (if (and ent
	   (= (vla-get-objectname ent) "AcDbLeader")
	   ) ;_ end of and
    (progn
      (setq counter 0)
      (if (vla-get-annotation ent)
	(progn
	  (if (= (vla-get-verticaltextposition ent) acabove)
	    (progn
	      (vla-put-annotation ent (vla-get-annotation ent))
	      (vla-put-verticaltextposition ent acabove)
	      ) ;_ end of progn
	    ) ;_ end of if
	  (vla-put-coordinate
	    ent
	    (1-	(/ (length (vlax-safearray->list
			     (vlax-variant-value (vla-get-coordinates ent))
			     ) ;_ end of vlax-safearray->list
			   ) ;_ end of length
		   3
		   ) ;_ end of /
		) ;_ end of 1-
	    (vla-get-insertionpoint (vla-get-annotation ent))
	    ) ;_ end of vla-put-coordinate
	  ) ;_ end of progn
	) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  ent
  ) ;_ end of defun
И командный реактор.
Код:
[Выделить все]
(if *vlr-cmd*
  (progn
    (setq *vlr-cmd* nil)
    (vlr-remove-all :vlr-command-reactor)
    ) ;_ end of progn
  ) ;_ end of if
(if (not *vlr-cmd*)
  (setq	*vlr-cmd* (vlr-command-reactor
		    "cmd"
		    '((:vlr-commandended . cmd-end))
		    ) ;_ end of VLR-Command-Reactor
	) ;_ end of setq
  ) ;_ end of if

(defun cmd-end (react	     cmd	  /	       list_obj
		selset	     item	  counter      leader_item
		cmd_name     leader_item_list	       up_string
		low_string
		)
  (setq	cmd_name (car cmd)
	counter	 0
	) ;_ end of setq
  (cond
    ((or (= cmd_name "MOVE")
	 (= cmd_name "COPY")
	 ) ;_ end of or
     (setq selset (ssget "_P"))
     (if selset
       (progn
	 (while	(setq item (ssname selset counter))
	   (setq counter (1+ counter))
	   ;; Далее для выносок
	   (cond
	     ((or (= (cdr (assoc 0 (entget item))) "MTEXT")
		  (= (cdr (assoc 0 (entget item))) "INSERT")
		  ) ;_ end of or
	      (if (and (assoc 330 (entget item))
		       (cdr (assoc 330 (entget item)))
		       ) ;_ end of and
		(progn			; элемент является аннотацией выноски
		  (setq	leader_item
			 (vlax-ename->vla-object
			   (cdr (assoc 330 (entget item)))
			   ) ;_ end of vlax-ename->vla-object
			) ;_ end of setq
		  (if (and (= (vla-get-objectname leader_item) "AcDbLeader")
			   (not (member leader_item list_obj))
			   ) ;_ end of and
		    (setq list_obj (append list_obj (list leader_item)))
		    ) ;_ end of if
		  ) ;_ end of progn
		) ;_ end of if
	      )
	     ((and (= (cdr (assoc 0 (entget item))) "LEADER")
		   (not (member (vlax-ename->vla-object item) list_obj))
		   ) ;_ end of and
	      (setq
		list_obj
		 (append list_obj (list (vlax-ename->vla-object item)))
		) ;_ end of setq
	      )
	     ) ;_ end of cond
	   ) ;_ end of while
	 ) ;_ end of progn
       ) ;_ end of if
     (foreach item list_obj
       (_kpblc-draw-leader-change-points-by-ent item) ; выполняемая функция
       ) ;_ end of foreach
     )
    ((= cmd_name "GRIP_STRETCH")
     (setq selset  (ssget "_I")
	   counter 0
	   ) ;_ end of setq
     (while (setq item (ssname selset counter))
       (setq counter (1+ counter))
       (cond
	 ((and
	    (= (cdr (assoc 0 (entget item))) "MTEXT")
	    (assoc 330 (entget item))
	    (= (cdr (assoc 0 (entget (cdr (assoc 330 (entget item))))))
	       "LEADER"
	       ) ;_ end of =
	    ) ;_ end of and
	  (setq	list_obj
		 (append
		   list_obj
		   (list
		     (vlax-ename->vla-object (cdr (assoc 330 (entget item))))
		     ) ;_ end of list
		   ) ;_ end of append
		) ;_ end of setq
	  )
	 ((= (cdr (assoc 0 (entget item))) "LEADER")
	  (setq list_obj (append list_obj (list (vlax-ename->vla-object item))))
	  )
	 ) ;_ end of cond
       ) ;_ end of while
     (foreach item list_obj
       (vla-put-verticaltextposition item acabove)
       (vla-put-coordinate
	 item
	 (1- (/	(length	(vlax-safearray->list
			  (vlax-variant-value (vla-get-coordinates item))
			  ) ;_ end of vlax-safearray->list
			) ;_ end of LENGTH
		3
		) ;_ end of /
	     ) ;_ end of 1-
	 (vlax-3d-point
	   (vlax-safearray->list
	     (vlax-variant-value
	       (vla-get-insertionpoint (vla-get-annotation item))
	       ) ;_ end of vlax-variant-value
	     ) ;_ end of vlax-safearray->list
	   ) ;_ end of vlax-3d-point
	 ) ;_ end of vla-put-coordinate
       ) ;_ end of foreach
     )
    ((= cmd_name "MTEDIT")
     (setq item (ssname (ssget "_P") 0))
     (if
       (and (assoc 330 (entget item))
	    (= (cdr (assoc 0 (entget (cdr (assoc 330 (entget item)))))) "LEADER")
	    ) ;_ end of and
	(progn
	  (setq	item	    (vlax-ename->vla-object (cdr (assoc 330 (entget item))))
		;; Тут надо преобразовать строку многострочника в не более
		;; чем 2 строки (заменить после первого \\P или \n все
		;; остальные)
		;; Нарисовать по новой выноску, сохранив предварительно ее
		;; значения и удалить item
		leader_item (vla-get-insertionpoint (vla-get-annotation item))
		up_string   (vl-string-trim
			      " \\P\n\t"
			      (vl-string-subst
				"\\P"
				"\n"
				(vla-get-textstring (vla-get-annotation item))
				) ;_ end of VL-STRING-SUBST
			      ) ;_ end of vl-string-trim
		) ;_ end of setq
	  (if (vl-string-search "\\P" up_string)
	    (progn
	      (setq low_string
			       (vl-string-trim
				 " \\P"
				 (substr up_string
					 (1+ (vl-string-search "\\P" up_string))
					 ) ;_ end of substr
				 ) ;_ end of vl-string-trim
		    up_string  (substr up_string 1 (vl-string-search "\\P" up_string))
		    ) ;_ end of setq
	      (while (vl-string-search "\\P" low_string)
		(setq low_string (vl-string-subst " " "\\P" low_string))
		) ;_ end of while
	      ) ;_ end of progn
	    ) ;_ end of if
	  (if low_string
	    ;; Строки 2, устанавливать точку выравнивания по Middle (изменить
	    ;; c Bottom)
	    (if	(> (vla-get-attachmentpoint (vla-get-annotation item)) 6)
	      (vla-put-attachmentpoint
		(vla-get-annotation item)
		(- (vla-get-attachmentpoint (vla-get-annotation item)) 3)
		) ;_ end of vla-put-AttachmentPoint
	      ) ;_ end of if
	    ;; Строка 1, устанавливать точку выравнивания по Bottom
	    (if	(< (vla-get-attachmentpoint (vla-get-annotation item)) 6)
	      (vla-put-attachmentpoint
		(vla-get-annotation item)
		(+ (vla-get-attachmentpoint (vla-get-annotation item)) 3)
		) ;_ end of vla-put-AttachmentPoint
	      ) ;_ end of if
	    ) ;_ end of if
	  (vla-put-textstring
	    (vla-get-annotation item)
	    (strcat up_string
		    (if	low_string
		      (strcat "\\P" low_string)
		      ""
		      ) ;_ end of if
		    ) ;_ end of strcat
	    ) ;_ end of vla-put-TextString
	  (vla-put-insertionpoint (vla-get-annotation item) leader_item)
	  (vla-put-verticaltextposition item acabove)
	  (vla-put-coordinate
	    item
	    (1-	(/ (length (vlax-safearray->list
			     (vlax-variant-value (vla-get-coordinates item))
			     ) ;_ end of vlax-safearray->list
			   ) ;_ end of LENGTH
		   3
		   ) ;_ end of /
		) ;_ end of 1-
	    leader_item
	    ) ;_ end of vla-put-coordinate
	  ) ;_ end of progn
	) ;_ end of if
     )
    ) ;_ end of cond
  ) ;_ end of defun
Функция использует командные реакторы, поэтому ее применять надо поаккуратнее (если есть свои). Мнение ShaggyDoc можно посмотреть на http://cad.kurganobl.ru/vb/showthread.php?t=68 . Вроде ничего не упустил. Подгружать надо оба файла.
По параметрам вроде как все понятно. Междумордие уже сами, господа, сами...
---
Добавлено: разработано только для 2-строчной выноски! Чтоб потом на меня не обижались, что не так работает
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.05.2006, 18:57
#8
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Цитата:
Сообщение от _Andre_
В приницпе можно разбить примитив MTEXT командой _explode, затем собрать полученные однострочные тексты и уже из них вытащить координаты, затем однострочные тексты удалить.
Обнаружил, что объект MTEXT не поддерживает метод EXPLODE
Как можно получить список объектов, которые получатся после взрывания МТекста командой _explode?
kp+ вне форума  
 
Непрочитано 24.05.2006, 07:22
#9
_Andre_

механизатор
 
Регистрация: 28.12.2004
Самара
Сообщений: 312
<phrase 1=


Ну я бы разрушил через (command "_.explode" entname), про метод не скажу, не знаю.

Узнать какая строка была первой а какая последней можно отсортировав собранные строки по координате у точки вставки.

Собрать примитвы полученные после разрушения МТЕХТ можно так.
перед разрушением запоминаем имя последнего примитива в базе чертежа
Код:
[Выделить все]
(setq last_ent (entlast))
Затем разрушаем МТЕХТ
Код:
[Выделить все]
(command "_.explode" MTEXT_name)
Затем собираем полученные примитивы (сбор основан на том, что заново создаваемые примитивы пишуться в коней базы чертежа, то есть просто находим все примитивы от запомненного ранее до конца базы). Я пользуюсь функцией из состава RuCAD
http://cad.kurganobl.ru/

Код:
[Выделить все]
(defun ru-ss-select-after-ent (ent_name / selection)
  (setq selection (ssadd))
  (while (and ent_name (setq ent_name (entnext ent_name)))
    (ssadd ent_name selection)
  ) ;_ end of while
  (if (zerop (sslength selection))
    nil
    selection
  ) ;_ end of if
)
То есть вот так
Код:
[Выделить все]
(setq ss ( ru-ss-select-after-ent last_ent))
Ну а дальше с полученным набором делаете что хотите
_Andre_ вне форума  
 
Автор темы   Непрочитано 24.05.2006, 10:38
#10
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


Вроде как получилось... Оказывается, первая строка подорванного МТЕКСТа оказывается первой в полученном наборе, причем в любом случае, без вариантов. Премного благодарен!
kp+ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно узнать координаты отдельных строк Мтекста?

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