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

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

Подсчет площадей выбранных контуром с фильтром по слою

Ответ
Поиск в этой теме
Непрочитано 05.08.2021, 16:34 #1
Подсчет площадей выбранных контуром с фильтром по слою
Lumpy
 
Регистрация: 25.06.2019
Сообщений: 9

Добрый день.
Пытаюсь сделать приложение которое будет считать сумму площадей выбранных контуров(замкнутых) в зависимости от слоя в котором он находиться.
Код:
[Выделить все]
 (defun C:SUM_AR ( /  ssp sspn n k ssk pp pl_ar)
(vl-load-com)
(setq item (ssget))
(setq ssp (ssget "_P" '((0 . "*POLYLINE")(8 . "_РД_Выемка"))))
(if ssp
	
     (progn
     (setq sspn (sslength ssp) n 0 k 0 ssk 0)
     (repeat sspn
                   (setq pp (ssname ssp n))
                   (if (= (vlax-get-property (vlax-ename->vla-object pp) 'Closed) :vlax-true)
                            (progn 
  ;                          (command "_-LAYER" "_M" "tmp" "_C" 31 "tmp" "")
  ;                          (command "_-BHATCH" "_s" pp "" "_P" "Solid" "") 
                            (setq pl_ar (vlax-get-property (vlax-ename->vla-object pp) 'Area))
                            (setq ssk (+ ssk pl_ar))
                            (setq k (1+ k))
                             )
                     )
                     (setq n (1+ n))
       )
	
       )
)
(setq item (ssget))
(setq ssp1 (ssget "_P" '((0 . "*POLYLINE")(8 . "_РД_Основание"))))
(if ssp1
	
     (progn
     (setq sspn1 (sslength ssp1) n1 0 k1 0 ssk1 0)
     (repeat sspn1
                   (setq pp1 (ssname ssp1 n1))
                   (if (= (vlax-get-property (vlax-ename->vla-object pp1) 'Closed) :vlax-true)
                            (progn 
  ;                          (command "_-LAYER" "_M" "tmp" "_C" 31 "tmp" "")
  ;                          (command "_-BHATCH" "_s" pp1 "" "_P" "Solid" "") 
                            (setq pl_ar (vlax-get-property (vlax-ename->vla-object pp1) 'Area))
                            (setq ssk1 (+ ssk1 pl_ar))
                            (setq k1 (1+ k1))
                             )
                     )
                     (setq n1 (1+ n1))
       )
	
       )
)
(setq pt (getpoint "\Укажите место вставки результата: "))
(VL-cmdf "_mtext" pt pause  (strcat "_РД_Выемка = " (rtos ssk 2 2) " кв.м \n" "_РД_Основание = " (rtos ssk1 2 2) " кв.м \n"))


(princ)
)

Приложение считает площади, но есть следующие проблемы:
1. Многочисленный выбор объектов(для каждого слоя приходиться заново выбирать объекты) слоев в дальнейшем планируется больше. Возможно ли как-то запросить выбор объектов у пользователя однократно?
2. Если среди выбранных объектов нет объектов в слое по которому идет фильтр то выпадает ошибка " ошибка: неверный тип аргумента: numberp: nil"
3. Интересует вопрос о принципиально другом алгоритме работы. Возможно ли получить список слоев выбранных контуров и если слои совпадают то происходит сложение их площадей?
Просмотров: 1797
 
Непрочитано 05.08.2021, 16:54
#2
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,823
<phrase 1=


Цитата:
Сообщение от Lumpy Посмотреть сообщение
1. Многочисленный выбор объектов(для каждого слоя приходиться заново выбирать объекты) слоев в дальнейшем планируется больше. Возможно ли как-то запросить выбор объектов у пользователя однократно?
Что мешает сделать фильтр на все полилинии слоя?
Код:
[Выделить все]
 (setq ssp1 (ssget "_X" '((0 . "*POLYLINE")(8 . "_РД_Выемка"))))
Цитата:
2. Если среди выбранных объектов нет объектов в слое по которому идет фильтр то выпадает ошибка " ошибка: неверный тип аргумента: numberp: nil"
Что мешает сделать проверку
Код:
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...

Последний раз редактировалось Alan, 05.08.2021 в 17:03.
Alan вне форума  
 
Непрочитано 05.08.2021, 16:56
#3
Кулик Алексей aka kpblc
Moderator

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


По-быстрому получение списка вида (("Слой" . ОбщаяПлощадь) ("Слой" . ОбщаяПлощадь) ...)
Код:
[Выделить все]
 (defun t1 (/ selset res layer)
  (if (setq selset (ssget '((0 . "*POLYLINE"))))
    (progn
      (foreach ent (mapcar (function vlax-ename->vla-object)
                           ((lambda (/ item tab)
                              (repeat (setq tab  nil
                                            item (sslength selset)
                                      ) ;_ end setq
                                (setq tab (cons (ssname selset (setq item (1- item))) tab))
                              ) ;_ end of repeat
                            ) ;_ end of lambda
                           )
                   ) ;_ end of mapcar
        (if (and (vlax-property-available-p ent 'area)
                 (vlax-property-available-p ent 'closed)
                 (equal (vla-get-closed ent) :vlax-true)
            ) ;_ end of and
          (progn (setq layer (vla-get-layer ent))
                 (if (cdr (assoc layer res))
                   (setq res (subst (cons layer (+ (cdr (assoc layer res)) (vla-get-area ent))) (assoc layer res) res))
                   (setq res (cons (cons layer (vla-get-area ent)) res))
                 ) ;_ end of if
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of progn
  ) ;_ end of if
  res
) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.08.2021, 16:58
#4
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,823
<phrase 1=


сократил пост
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 05.08.2021, 17:03
#5
Кулик Алексей aka kpblc
Moderator

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


Если будет использоваться мой код, то получение строки (как пример):
Код:
[Выделить все]
 (if (setq str (t1)
          str (mapcar (function (lambda (x) (strcat (car x) " : " (rtos (cdr x) 2 14)))) str)
    ) ;_ end of setq
  (strcat (car str)
          (apply (function strcat) (mapcar (function (lambda (x) (strcat "\n" x))) (cdr str)))
  ) ;_ end of strcat
)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Подсчет площадей выбранных контуром с фильтром по слою

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет площадей квартиры и составление квартирографии в Autocad Architecture? Pavel_hoz Вертикальные решения на базе AutoCAD 19 28.12.2018 15:04
Автоматический подсчет общей, жилой и приведенной площадей квартир s_get Вертикальные решения на базе AutoCAD 27 27.06.2013 15:04
Автоматический нумерация и подсчет площадей по размерам. Реально? Yur.OK_SPb AutoCAD 13 18.06.2013 11:57
Автоматизировать подсчет суммы длин отрезков по определенному слою? Возможно ли? nikolakrg Программирование 11 26.10.2012 17:20
ADT2007 подсчет площадей. favorite Прочее. Программное обеспечение 7 07.07.2006 17:16