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

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

Как автоматизировать расчет площади криволинейного изделия?

Ответ
Поиск в этой теме
Непрочитано 09.07.2009, 12:33 #1
Как автоматизировать расчет площади криволинейного изделия?
Savuk
 
Конструктор
 
Киев
Регистрация: 04.08.2007
Сообщений: 22

Подскажите пожалуйста - как возможно автоматизировать процесс расчета чистой площади изделия площади, по определенному контуру, с учетом всех отверстий и выступов, при этом необходимо игнорировать все слои кроме одного.

На сегодняшний день я беру и просто заливаю объект штриховкой и из свойств штриховки достаю площадь штриховки. Но так-как в день у меня бывает и до 10 проектов в день, это немного утомительно!

В вложенном файле я приложи пример файла и штриховкой указал ту площадь которую необходимо просчитать. Границы расчеты по слою «CUT»

Вложения
Тип файла: dwg
DWG 2000
Пример.dwg (143.7 Кб, 421 просмотров)

Просмотров: 3226
 
Непрочитано 09.07.2009, 12:39
#2
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,924
<phrase 1=


связка _boundary + _properties или _area тебе в помощь
игнорируемые слои заморозить
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 09.07.2009, 12:53
#3
Savuk

Конструктор
 
Регистрация: 04.08.2007
Киев
Сообщений: 22


Цитата:
Сообщение от zenon Посмотреть сообщение
связка _boundary + _properties или _area тебе в помощь
игнорируемые слои заморозить
Честно говоря, то как я делаю сейчас мен проще, так как у меня иногда в нутрии одного объекта может быт несколько десятков других которые на готовом изделии будут удаляться, и я крайне редко работаю с полилиниями.
Savuk вне форума  
 
Непрочитано 09.07.2009, 13:52
#4
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Код:
[Выделить все]
;;;plosad v text
(defun c:hls ( / pnt pls pls_str pls_str_p kor_str spis_st tsz size_p)
(setq tsz (getvar "TEXTSIZE")) 
(setq pnt (getpoint))
(command "_.bhatch" pnt "")
(setq pln (entlast))
(command "_.AREA" "_O" pln)
(entdel pln) 
(setq pls (getvar "area"))
;(setq pls (* 0.000001 (getvar "area")))
(setq pls_str (rtos pls 2 2)) ; 
(setq pls_str (strcat "S = " pls_str "sq.m."))
(setq pls_str_p (cons 1 pls_str)) ;para  
(setq size_p (cons 40 tsz)) ;
(setq kor_str (append '(10) pnt))
(setq spis_st (list '(0 . "TEXT") kor_str '(100 . "AcDbEntity") 
                    size_p pls_str_p '(50 . 0)                    
                    '(7 . "Standard") '(100 . "AcDbText")))
(entmake spis_st)
)

Последний раз редактировалось Victor, 09.07.2009 в 14:28. Причина: nu oshibsja da
Victor вне форума  
 
Непрочитано 09.07.2009, 14:30
#5
Кулик Алексей aka kpblc
Moderator

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


Еще один вариант (небезгрешный):
Код:
[Выделить все]
(defun get-area (/                          _kpblc-conv-selset-to-ename
                 _kpblc-eval-value-round    _kpblc-conv-vla-to-list    _kpblc-conv-list-to-3dpoints
                 ent                        selset                     obj_lst
                 )

  (defun _kpblc-eval-value-round (value to)
                                 ;|
;; http://forum.dwg.ru/showthread.php?p=301275
*    Выполняет округление числа до указанной точности
*    Примеры вызова:
(_kpblc-eval-value-round 16.365 0.01) ; 16.37
|;
    (if (zerop to)
      value
      (* (atoi (rtos (/ (float value) to) 2 0)) to)
      ) ;_ end of if
    ) ;_ end of defun

  (defun _kpblc-conv-list-to-3dpoints (lst / res)
                                      ;|
*    Функция конвертации списка чисел в список 3-мерных точек.
*    Параметры вызова:
*	lst	список чисел
*    Примеры вызова:
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5 6)) ;-> ((1 2 3) (4 5 6))
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5))   ;-> ((1 2 3) (4 5 0.))
|;
    (cond
      ((not lst)
       nil
       )
      (t
       (setq res (cons (list (car lst)
                             (if (cadr lst)
                               (cadr lst)
                               0.
                               ) ;_ end of if
                             (if (caddr lst)
                               (caddr lst)
                               0.
                               ) ;_ end of if
                             ) ;_ end of list
                       (_kpblc-conv-list-to-3dpoints (cdddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    res
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar '_kpblc-conv-vla-to-list value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (member (type value) (list 'ename 'str 'vla-object))
            (setq value (_kpblc-conv-ent-to-vla value))
            (and (= (type value) 'vla-object)
                 (vlax-property-available-p value 'count)
                 ) ;_ end of and
            ) ;_ end of and
       (vlax-for sub (_kpblc-conv-ent-to-vla value)
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
                                     ;|
*    Преобразование набора, полученного через ssget, в список ename-представлени
* примитивов.
*    Параметры вызова:
	selset	набор примитивов
*    Примеры вызова:
(_kpblc-conv-selset-to-ename (ssget))
|;
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((listp selset) selset)
      ) ;_ end of cond
    ) ;_ end of defun


  (if (= (type (setq ent (vl-catch-all-apply
                           (function
                             (lambda ()
                               (princ "\nУкажите внешний контур <Отмена> : ")
                               (ssname (ssget "_:S" '((0 . "LWPOLYLINE") (70 . 1))) 0)
                               ) ;_ end of lambda
                             ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'ename
         ) ;_ end of =
    (progn
      (setq selset  (ssget "_X" (list (assoc 8 (entget ent))))
            ent     (vlax-ename->vla-object ent)
            obj_lst 0.
            ) ;_ end of setq
      (vla-getboundingbox ent 'minp 'maxp)
      (setq minp (mapcar (function (lambda (x) (_kpblc-eval-value-round x 1e-3))) (_kpblc-conv-vla-to-list minp))
            maxp (mapcar (function (lambda (x) (_kpblc-eval-value-round x 1e-3))) (_kpblc-conv-vla-to-list maxp))
            ) ;_ end of setq
      (foreach item (mapcar (function vlax-ename->vla-object) (_kpblc-conv-selset-to-ename selset))
        (if (and (not (equal item ent))
                 (not (_kpblc-conv-vla-to-list (vla-intersectwith ent item acextendnone)))
                 ((lambda (/ _min _max)
                    (vla-getboundingbox item '_min '_max)
                    (setq _min (mapcar (function (lambda (x) (_kpblc-eval-value-round x 1e-3))) (_kpblc-conv-vla-to-list _min))
                          _max (mapcar (function (lambda (x) (_kpblc-eval-value-round x 1e-3))) (_kpblc-conv-vla-to-list _max))
                          ) ;_ end of setq
                    (and (equal nil (vl-remove t (mapcar '<= minp _min)))
                         (equal nil (vl-remove t (mapcar '>= maxp _max)))
                         ) ;_ end of and
                    ) ;_ end of lambda
                  )
                 ) ;_ end of and
          (setq obj_lst (+ obj_lst
                           (cond
                             ((vlax-property-available-p item 'area) (vla-get-area item))
                             (t 0.)
                             ) ;_ end of cond
                           ) ;_ end of +
                ) ;_ end of setq
          ) ;_ end of if
        ) ;_ end of foreach
      (if obj_lst
        (princ (strcat "\nArea : " (rtos (- (vla-get-area ent) obj_lst) 2)))
        ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.07.2009, 14:54
#6
serov


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


Victor
у тебя "; (setq pls (* 0.000001 (getvar "area")))"
надо: "(setq pls (* 0.000001 (getvar "area")))
Хотя я честно не понимаю, зачем нужна "автоматизация". По посту #2 все очень просто и быстро.
PS area работает только с объектами (region)? А так только наружный контур
Offtop: "Command: _.AREA
Specify first corner point or [Object/Add/Subtract]: _O
Select objects:
Selected object does not have an area

Select objects: ((0 . "TEXT") (10 455.104 397.479 0.0) (100 . "AcDbEntity") (40
. 0.2) (1 . "S = .18sq.m.")
С регионами
Command: _.AREA
Specify first corner point or [Object/Add/Subtract]: _O
Select objects:
Area = 181458.392, Perimeter = 477.5221

Command: ((0 . "TEXT") (10 594.435 259.436 0.0) (100 . "AcDbEntity") (40 . 0.2)
(1 . "S = 18145.84sq.m.)
и делить на 100000

Последний раз редактировалось serov, 09.07.2009 в 15:39.
serov вне форума  
 
Непрочитано 09.07.2009, 15:06
#7
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Да мне то всё равно. Делайте как хотите.
Ваша доработка мне непонятна.
Victor вне форума  
 
Непрочитано 09.07.2009, 15:38
#8
Кулик Алексей aka kpblc
Moderator

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


Кхек, можно влезть? Мое чудовище никто не гонял? Что-нибудь получается в результате или ни в какую?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.07.2009, 15:49
#9
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Это зависит в каких единицах рисунок. В метрах или миллиметрах

Последний раз редактировалось Victor, 09.07.2009 в 16:48.
Victor вне форума  
 
Автор темы   Непрочитано 09.07.2009, 17:48
#10
Savuk

Конструктор
 
Регистрация: 04.08.2007
Киев
Сообщений: 22


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кхек, можно влезть? Мое чудовище никто не гонял? Что-нибудь получается в результате или ни в какую?
Я попробывал прогнать, но у меня ничего не получилось
Savuk вне форума  
 
Непрочитано 09.07.2009, 17:57
#11
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,924
<phrase 1=


Offtop: Кулик Алексей aka kpblc, извиняюсь, а вот что по сей теме??
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как автоматизировать расчет площади криволинейного изделия?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Площади Area с коэфициентом, как зделать? Demart Прочее. Программное обеспечение 2 17.12.2005 19:26
Как бы сделать динамическое изменение значения площади? Grinzaid Динамические блоки 8 02.08.2004 18:02