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

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

Как просуммировать текст с видового экрана в пространстве листа при помощи лиспа

Ответ
Поиск в этой теме
Непрочитано 27.01.2017, 15:31 #1
Как просуммировать текст с видового экрана в пространстве листа при помощи лиспа
megabeton
 
Регистрация: 03.12.2009
Сообщений: 84

Доброго дня!

Дано:
На чертеже разбросан текст (подписаны площади стен, к примеру). Достаточно часто текст корректируется на отдельных участках чертежа. Есть необходимость регулярно суммировать текст с отдельных участков чертежа. Текст расположен друг к другу достаточно плотно. Регулярно вычленять текстовые примитивы с чертежа (к примеру для отдельной квартиры с плана дома) для суммирования крайне трудоемко.

Имеется: Лисп для суммирования текста (во вложении)

Хочется: Этим лиспом "легким движением руки" просуммировать текст, расположенный в определенном _контуре_/_поле_/_многоугольной рамке_ не включая в набор соседние текстовые примитивы, расположенные вне _контура_/_поля_/_многоугольной рамки_.

Самый простой способ создать такой _контур_/_поле_/_многоугольную рамку_ вижу в создании видового экрана в пространстве листа. НО. Приложенный лисп не суммирует текст внутри видового экрана "легким движением руки", т.е. суммирует, но только, если войти в видовой экран в режиме правки, но это не то. Хочется, чтобы выделил видовой экран, и лисп просуммировал все что попало в границы видового экрана.

Просьба знатоков подсказать, как можно решить сию проблему корректировкой кода лиспа, либо подсказать иной, не сильно трудоемкий способ суммирования текстов в заданной "непрямоугольной" области.

Вложения
Тип файла: lsp сум_ма.lsp (1.6 Кб, 17 просмотров)

Просмотров: 2162
 
Непрочитано 27.01.2017, 20:00
#2
kp+

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


Цитата:
Сообщение от megabeton Посмотреть сообщение
Самый простой способ создать такой _контур_/_поле_/_многоугольную рамку_ вижу в создании видового экрана в пространстве листа.
Далеко не самый простой способ с точки зрения программной обработки. Лучше полилиния в модели в непечатаемом слое.
Примеров кода для выбора внутри полилинии множество. Например, http://forum.dwg.ru/showpost.php?p=813103&postcount=15
Также непонятно, чем плохо стандартное "извлечение данных" с выводом результата в обновляемую таблицу.
kp+ вне форума  
 
Автор темы   Непрочитано 31.01.2017, 11:43
#3
megabeton


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


Разобрался. Так действительно проще
Спасибо большое.

----- добавлено через ~3 ч. -----
А может кто подскажет, как прикрутить к этому коду суммирование выбранных в пределах полилинии текстов (код сумматора во вложении к теме)

хотя не надо, разобрался

Код:
[Выделить все]
 ;| ! *******************************************************************
;; !                  lib:IsPtInView
;; ! *******************************************************************
;; ! Проверяет находится ли точка в видовом экране
;; ! Auguments: 'pt'  - Точка для анализа в МСК!!!
;; ! Return   : T или nil если 'pt' в видовом экране или нет
;; ! *******************************************************************|;
(defun lib:IsPtInView (pt / VCTR Y_Len SSZ X_Pix Y_Pix X_Len Lc Uc)
(setq pt (trans pt 0 1))  
(setq VCTR (getvar "VIEWCTR") Y_Len (getvar "VIEWSIZE")
   SSZ (getvar "SCREENSIZE")
   X_Pix (car SSZ) Y_Pix (cadr SSZ)
   X_Len (* (/ X_Pix Y_Pix) Y_Len)
   Lc (polar VCTR (dtr 180.0) (* 0.5 X_Len))
   Uc (polar Lc 0.0 X_Len)
   Lc (polar Lc (dtr 270.0) (* 0.5 Y_Len))
   Uc (polar Uc (dtr 90.0) (* 0.5 Y_Len)))
(if (and (> (car pt) (car Lc))(< (car pt) (car Uc))
	 (> (cadr pt) (cadr Lc))(< (cadr pt) (cadr Uc)))
	T nil))
(defun DTR (a)(* pi (/ a 180.0)))
;| ! ***************************************************************************
;; !           lib:pt_extents
;; ! ***************************************************************************
;; ! Function : Возвращает границы MIN, MAX X,Y,Z списка точек
;; ! Argument : 'vlist' - Список точек
;; ! Returns  : Список точек (ЛевНижн ПравВерхн)
;; ! ***************************************************************************|;
(defun  lib:pt_extents (vlist / tmp)
(setq tmp (mapcar '(lambda (x) (vl-remove-if 'null x))
 (mapcar '(lambda (what) (mapcar '(lambda (x) (nth what x)) vlist))
 '(0 1 2))));_setq
  (list (mapcar '(lambda(x)(apply 'min x)) tmp)(mapcar '(lambda(x)(apply 'max x)) tmp)));_defun

; ! ***********************************************************
;; !                             lib:Zoom2Lst
;; ! **********************************************************
;; ! Function : Zoom границ списка точек
;; ! Arguments: 'vlist' - Список точек в МСК!!!!
;; ! Зуммирует экран, чтобы все точки были видны
;; ! Returns  : t - было зуммирование nil - нет
;; ! **********************************************************
(defun lib:Zoom2Lst( vlist / bl tr Lst OS)
(setq	Lst (lib:pt_extents vlist) bl (car Lst) tr (cadr Lst))
(if (not (and (lib:IsPtInView bl) (lib:IsPtInView tr)))
(progn  (setq OS (getvar "OSMODE"))(setvar "OSMODE" 0)
(command "_.Zoom" "_Window" (trans bl 0 1)(trans tr 0 1)
	"_.Zoom" "0.95x")
(setvar "OSMODE" OS) T) NIL))

;****** Команда *******

(defun C:ввыс ( / en pl n ss lst)
  (setq en (car(entsel "\nУкажите полилинию: ")))
  (if (and en (wcmatch (cdr(assoc 0 (entget en))) "*POLYLINE"))
    (progn (setq pl (vlax-ename->vla-object en) n 0)
      (while (<= n (vlax-curve-getEndParam pl))
	(setq lst (append lst (list (vlax-curve-getPointAtParam pl n)))
	      n   (1+ n)))
      (lib:Zoom2Lst lst);_Гарантированно полилиния на экране
      (setq lst (mapcar '(lambda(x)(trans x 0 1)) lst))
      (if (setq ss (ssget "_WP" lst))(SSSETFIRST ss ss))
      (setq ss nil))(princ))
(princ "\nНаберите в командной строке SPL")

  (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

  (vl-load-com)
  (setq	*kpblc-activedoc*
	 (vla-get-activedocument (vlax-get-acad-object))
	res 0.
	) ;_ end of setq
  (vla-startundomark *kpblc-activedoc*)
  (if (setq selset (ssget '((0 . "TEXT,MTEXT"))))
    (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
      (setq
	res (+ res (atof (vla-get-textstring (vlax-ename->vla-object ent))))
	) ;_ end of setq
      ) ;_ end of foreach
    ) ;_ end of if
  (if (and (not (equal res 0. 1e-3))
	   (setq ins_pt (getpoint "\nУкажите точку вставки результата : "))
	   ) ;_ end of and
    (progn
      (if (= (setq txt_height
		    (vla-get-height
		      (vla-get-activetextstyle *kpblc-activedoc*)
		      ) ;_ end of vla-get-Height
		   ) ;_ end of setq
	     0.
	     ) ;_ end of =
	(if
	  (not (setq txt_height (getreal "\nВведите высоту текста <2.5> : ")))
	   (setq txt_height 2.5)
	   ) ;_ end of if
	) ;_ end of if
      (vla-addmtext
	(_kpblc-get-active-space-obj)
	(vlax-3d-point ins_pt)
	1.
	(rtos res 2)
	) ;_ end of vla-AddMText
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark *kpblc-activedoc*)
  (princ)
  ) ;_ end of defun

Последний раз редактировалось megabeton, 31.01.2017 в 15:06.
megabeton вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как просуммировать текст с видового экрана в пространстве листа при помощи лиспа

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему может тормозить автокад при перемещении видового экрана в пространстве листа? hudozhnik AutoCAD 23 07.03.2017 13:03
Простановка размеров в пространстве листа Serz AutoCAD 8 18.03.2014 13:53
Поворот видового экрана? esp1413 AutoCAD 2 16.03.2012 14:56
как выйти из видового экрана в пространстве листа Grigorii_K AutoCAD 9 24.03.2011 18:39
Проблема с зумом в пространстве листа sgt AutoCAD 4 16.03.2011 18:16