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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как определить площадь поверхности 3d Объекта? Autolisp.

Как определить площадь поверхности 3d Объекта? Autolisp.

Ответ
Поиск в этой теме
Непрочитано 23.12.2012, 11:33 #1
Как определить площадь поверхности 3d Объекта? Autolisp.
Chip115
 
Регистрация: 22.12.2012
Сообщений: 18

Всем привет! Поставили задачу написать программу на языке autolisp, которая будет определять площадь поверхности 3D объекта. В качестве объекта я условно взял куб (то, что первое в голову пришло). Так как с лиспом абсолютно не знаком,то конечно же столкнулся с трудностями. В общем, помогите начать. Даже не знаю с какой стороны подходить к решению этой проблемы. Ознакомился с синтаксисом, написал простенькие программы. Вроде проникся темой.
Я нашел функцию, которая возвращает параметры нарисованного объекта. Вот что получилось
Код:
[Выделить все]
(setq myline (entget (entlast)))
((-1 . <Имя объекта: 7ef03568>) (0 . "LINE") (330 . <Имя объекта: 7ef01cf8>) (5 
. "225") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbLine") (10 1816.85 1127.13 0.0) (11 4263.73 1486.39 0.0) (210 0.0 0.0 1.0))
Это была просто линия. С параметрами я разобрался.
Вот думаю, можно ли юзая эту функцию вычислить координаты ребер куба, а потом вычислить площадь - дело техники?
Короче, сказано - сделано. Нарисовал куб со сторонами 10х10х10. Ввел команду и вот что получил.
Код:
[Выделить все]
(setq myobj(entget (entlast)))
((-1 . <Имя объекта: 7ef035f0>) (0 . "3DSOLID") (330 . <Имя объекта: 7ef01cf8>) 
(5 . "236") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . 
"AcDbModelerGeometry") (70 . 1) (1 . "mnjoo nnj m mk ") (1 . "ni 
^*+0;:,4 ^*+0\\^[ nf ^LR mnhqoqoqkjol QK o ") (1 . "n fqfffffffffffffffj:rooh 
n:rono ") (1 . ">,27:>;:- {rn rn _nm mnhqoqoqkjol |") (1 . "=0;& {m rn {rn {l 
{rn {rn |") (1 . "-:9@)+r:&:r>++-6= {rn rn {rn {rn {n {k {j |") (1 . "3*2/ {i 
rn {rn {rn {h {n |") (3 . ":&:@-:961:2:1+ {rn rn _j 8-6; n _l +-6 n _k ,*-9 o 
_l >;5 o _k 8->; o _f /0,+<7:<4 o _k <>3< n _k <01) o _k ,+03 
oqolmlkjflfkmhinkmnm _k 1+03 lo _k;,63 o _g 93>+1:,, o _h /6'>-:> o _k 72>' o 
_i 8-6;>- o _j 28-6; looo _j *8-6; o _j )8-6; o _no :1;@96:3;,") (1 . " |") (1 
. "):-+:'@+:2/3>+: {rn rn l o n g |") (1 . "-:9@)+r:&:r>++-6= {rn rn {rn {rn {l 
{k {j |") (1 . ",7:33 {g rn {rn {rn {rn {f {rn {l |") (1 . "-:9@)+r:&:r>++-6= 
{rn rn {rn {rn {h {k {j |") (1 . "9><: {no rn {rn {nn {nm {h {rn {nl 90-(>-; 
,6183: |") (1 . "92:,7r:&:r>++-6= {rn rn {nk {rn {f |") (1 . "9><: {nj rn {rn 
{ni {nh {h {rn {ng -:-,:; ,6183: |") (1 . "300/ {rn rn {rn {rn {nf {f |") (1 
. "/3>1:r,*-9><: {rn rn {rn jqklmlmjinlnkjmmk jqoooooooooooooojl 
roqilijnjfgljohjjoml o o n n o o 90-(>-;@) V V V V |") (1 . "-:9@)+r:&:r>++-6= 
{rn rn {rn {no {f {k {j |") (1 . "92:,7r:&:r>++-6= {rn rn {mo {rn {nn |") (1 . 
"9><: {mn rn {rn {mm {ml {h {rn {mk -:-,:; ,6183: |") (1 . "300/ {rn rn {rn 
{rn {mj {nn |") (1 . "/3>1:r,*-9><: {rn rn {rn jqklmlmjinlnkjmmk 
jqoooooooooooooojl rnoqilijnjfgljohjj o o n n o o 90-(>-;@) V V V V |") (1 . 
"<0:;8: {rn rn {rn {mi {mh {mg {mf 90-(>-; {nm {rn |") (1 . "-:9@)+r:&:r>++-6=
{rn rn {rn {nj {nn {k {j |") (1 . "92:,7r:&:r>++-6= {rn rn {lo {rn {ni |") (1 . 
"9><: {ln rn {rn {lm {ll {h {rn {lk -:-,:; ,6183: |") (1 . "300/ {rn rn {rn 
{rn {lj {ni |") (1 . "/3>1:r,*-9><: {rn rn {rn jqklmlmjinlnkjmmk 
jqlmfohojngmoohjnk:ronj rjqilijnjfgljohjjom o n o o o n 90-(>-;@) V V V V |") 
(1 . "<0:;8: {rn rn {rn {li {lh {lg {lf 90-(>-; {nh {rn |") (1 . "<0:;8: {rn rn 
{rn {ko {nf {kn {km 90-(>-; {nm {rn |") (1 . "<0:;8: {rn rn {rn {nf {ko {kl {kk 
90-(>-; {nm {rn |") (1 . "<0:;8: {rn rn {rn {kj {ki {nf {mf -:-,:; {kh {rn 
|") (1 . ":;8: {kg rn {rn {kf rj {jo j {mg {jn 90-(>-; _h *1410(1 |") (1 . 
"-:9@)+r:&:r>++-6= {rn rn {rn {mn {ni {k {j |") (1 . "92:,7r:&:r>++-6= {rn rn 
{jm {rn {mm |") (1 . "9><: {jl rn {rn {jk {jj {h {rn {ji -:-,:; ,6183: |") (1 
. "300/ {rn rn {rn {rn {jh {mm |") (1 . "/3>1:r,*-9><: {rn rn {rn 
oqklmlmjinlnkjmmk jqoooooooooooooojl rjqilijnjfgljohjjom n o o o o rn 90-(>-;@) 
V V V V |") (1 . "<0:;8: {rn rn {rn {jg {kl {jf {io 90-(>-; {ml {rn |") (1 . 
"<0:;8: {rn rn {rn {in {mj {jg {im 90-(>-; {nh {rn |") (1 . "<0:;8: {rn rn {rn 
{mj {in {il {ik 90-(>-; {nh {rn |") (1 . "<0:;8: {rn rn {rn {ki {kj {mj {lf 
-:-,:; {kh {rn |") (1 . ":;8: {ij rn {rn {ii rj {ih j {lg {ig 90-(>-; _h 
*1410(1 |") (1 . "<0:;8: {rn rn {rn {mh {mi {if {ho 90-(>-; {nm {rn |") (1 . 
"<0:;8: {rn rn {rn {hn {hm {mi {km -:-,:; {jj {rn |") (1 . ":;8: {hl rn {rn 
{jo rj {hk j {kn {hj 90-(>-; _h *1410(1 |") (1 . "<0:;8: {rn rn {rn {lj {hi {mh 
{kk -:-,:; {ml {rn |") (1 . ":;8: {hh rn {rn {hg rj {kf j {kl {hf 90-(>-; _h 
*1410(1 |") (1 . "<0:;8: {rn rn {rn {lg {mg {hi {go 90-(>-; {kh {rn |") (1 . 
"<0:;8: {rn rn {rn {mg {lg {hn {gn -:-,:; {kh {rn |") (1 . "300/ {rn rn {rn 
{rn {kj {jk |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {mf |") (1 . "):-+:' {rn 
rn {rn {mf o {gm |") (1 . "):-+:' {rn rn {rn {mf n {gl |") (1 . ",+->687+r<*-): 
{rn rn {rn noqklmlmjinlnkjmmk jqoooooooooooooojl roqilijnjfgljohjjoml o n o V V 
|") (1 . "-:9@)+r:&:r>++-6= {rn rn {rn {ln {mm {k {j |") (1 . "92:,7r:&:r>++-6= 
{rn rn {gk {rn {lm |") (1 . "9><: {gj rn {rn {rn {kh {h {rn {gi -:-,:; ,6183: 
|") (1 . "300/ {rn rn {rn {rn {hn {lm |") (1 . "/3>1:r,*-9><: {rn rn {rn 
jqklmlmjinlnkjmmk noqooooooooooooooj rjqilijnjfgljohjjom o rn o o o rn 
90-(>-;@) V V V V |") (1 . "<0:;8: {rn rn {rn {gh {if {hm {gg 90-(>-; {ll {rn 
|") (1 . "<0:;8: {rn rn {rn {hi {lj {li {im -:-,:; {ml {rn |") (1 . "<0:;8: 
{rn rn {rn {if {gh {lj {io
-:-,:; {ll {rn |") (1 . ":;8: {gf rn {rn {hg rj {fo j {jf {fn 90-(>-; _h 
*1410(1 |") (1 . "<0:;8: {rn rn {rn {lh {li {gh {fm 90-(>-; {nh {rn |") (1 . 
":;8: {fl rn {rn {ih rj {fo j {jg {fk 90-(>-; _h *1410(1 |") (1 . "<0:;8: {rn 
rn {rn {hm {hn {lh {ik -:-,:; {jj {rn |") (1 . ":;8: {fj rn {rn {fi rj {ii j 
{il {fh 90-(>-; _h *1410(1 |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {lf |") 
(1 . "):-+:' {rn rn {rn {lf o {fg |") (1 . "):-+:' {rn rn {rn {go n {ff |") (1 
. ",+->687+r<*-): {rn rn {rn noqklmlmjinlnkjmmk jqoooooooooooooojl 
rnoqilijnjfgljohjj o rn o V V |") (1 . "<0:;8: {rn rn {rn {jh {jf {ko {ho 
-:-,:; {ll {rn |") (1 . ":;8: {noo rn {rn {hk rj {hg j {if {non 90-(>-; _h 
*1410(1 |") (1 . "<0:;8: {rn rn {rn {il {kn {ki {gn 90-(>-; {jj {rn |") (1 . 
"<0:;8: {rn rn {rn {kn {il {jh {gg -:-,:; {jj {rn |") (1 . "/+36,+r:&:r>++-6= 
{rn rn {rn {rn {km |") (1 . "):-+:' {rn rn {rn {km n {nom |") (1 . 
",+->687+r<*-): {rn rn {rn jqklmlmjinlnkjmmk noqooooooooooooooj 
roqilijnjfgljohjjoml rn o o V V |") (1 . "<0:;8: {rn rn {rn {kl {jg {kj {go 
-:-,:; {ml {rn |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {kk |") (1 . 
"):-+:' {rn rn {rn {ho n {nol |") (1 . ",+->687+r<*-): {rn rn {rn 
jqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj roqilijnjfgljohjjoml n o o V V |") (1 
. ":;8: {nok rn {rn {kf rj {ih j {kj {noj 90-(>-; _h *1410(1 |") (1 . ":;8: 
{noi rn {rn {jo rj {ii j {ki {noh 90-(>-; _h *1410(1 |") (1 . "/061+ {rn rn {rn 
noqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj roqilijnjfgljohjjoml |") (1 . "/061+ 
{rn rn {rn noqklmlmjinlnkjmmk noqooooooooooooooj roqilijnjfgljohjjoml |") (1 . 
"-:9@)+r:&:r>++-6= {rn rn {rn {jl {lm {k {j |") (1 . "92:,7r:&:r>++-6= {rn rn 
{nog {rn {jk |") (1 . "/3>1:r,*-9><: {rn rn {rn noqklmlmjinlnkjmmk 
jqoooooooooooooojl rjqilijnjfgljohjjom rn o o o o n 90-(>-;@) V V V V |") (1 . 
"<0:;8: {rn rn {rn {jf {jh {in {fm -:-,:; {ll {rn |") (1 . ":;8: {nof rn {rn 
{hk rj {fi j {hm {nno 90-(>-; _h *1410(1 |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn 
{rn {io |") (1 . "):-+:' {rn rn {rn {fm o {nnn |") (1 . ",+->687+r<*-): {rn rn 
{rn oqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj rjqilijnjfgljohjjom o o rn V V 
|") (1 . ":;8: {nnm rn {rn {fo rj {fi j {gh {nnl 90-(>-; _h *1410(1 |") (1 . 
"/+36,+r:&:r>++-6= {rn rn {rn {rn {im |") (1 . ",+->687+r<*-): {rn rn {rn 
jqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj rnoqilijnjfgljohjj rn o o V V |") (1 
. "/+36,+r:&:r>++-6= {rn rn {rn {rn {ik |") (1 . "):-+:' {rn rn {rn {ik o {nnk 
|") (1 . ",+->687+r<*-): {rn rn {rn jqklmlmjinlnkjmmk noqooooooooooooooj 
rnoqilijnjfgljohjj n o o V V |") (1 . "/061+ {rn rn {rn noqklmlmjinlnkjmmk 
noqooooooooooooooj rnoqilijnjfgljohjj |") (1 . "/061+ {rn rn {rn 
noqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj rnoqilijnjfgljohjj |") (1 . 
"/+36,+r:&:r>++-6= {rn rn {rn {rn {ho |") (1 . ",+->687+r<*-): {rn rn {rn 
oqklmlmjinlnkjmmk jqoooooooooooooojl roqilijnjfgljohjjoml o rn o V V |") (1 . 
"/061+ {rn rn {rn oqklmlmjinlnkjmmk noqooooooooooooooj roqilijnjfgljohjjoml |") 
(1 . "/061+ {rn rn {rn oqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj 
roqilijnjfgljohjjoml |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {go |") (1 . 
",+->687+r<*-): {rn rn {rn noqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj 
rjqilijnjfgljohjjom o o rn V V |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {gn 
|") (1 . ",+->687+r<*-): {rn rn {rn noqklmlmjinlnkjmmk noqooooooooooooooj 
rjqilijnjfgljohjjom o o rn V V |") (1 . "-:9@)+r:&:r>++-6= {rn rn {rn {gj {jk 
{k {j |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {gg |") (1 . ",+->687+r<*-): 
{rn rn {rn oqklmlmjinlnkjmmk noqooooooooooooooj rjqilijnjfgljohjjom o o rn V V 
|") (1 . "/061+ {rn rn {rn oqklmlmjinlnkjmmk jqlmfohojngmoohjnk:ronj 
rnoqilijnjfgljohjj |") (1 . "/+36,+r:&:r>++-6= {rn rn {rn {rn {fm |") (1 . 
",+->687+r<*-): {rn rn {rn oqklmlmjinlnkjmmk jqoooooooooooooojl 
rnoqilijnjfgljohjj o n o V V |") (1 . "/061+ {rn rn {rn oqklmlmjinlnkjmmk 
noqooooooooooooooj rnoqilijnjfgljohjj |") (100 . "AcDb3dSolid") (350 . <Имя 
объекта: 7ef03608>))
Ад. И ничего не ясно с возвращаемым кодом. Кажется иду не тем путем. Подскажите, как более рационально решить задачу?
Просмотров: 2843
 
Непрочитано 23.12.2012, 12:54
#2
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (vl-load-com)
(defun test (/ obj)
  (setq obj (vlax-ename->vla-object (car (entsel))))
  (if (vlax-property-available-p obj 'area)
    (vla-get-area obj)
    ) ;_ end of if
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.12.2012, 14:24
#3
Chip115


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


Спасибо. Буду разбираться. А почему после выбора объекта, функция test возвращает nil?
Так. Вроде начал разбираться. Она работает, когда 2D объект. Площадь квадрата вычисляет нормально, а вот площадь поверхности куба не хочет

Последний раз редактировалось Chip115, 23.12.2012 в 14:48.
Chip115 вне форума  
 
Непрочитано 23.12.2012, 15:02
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


команда area с опцией выбора объекта, затем просмотр переменной area
gomer вне форума  
 
Автор темы   Непрочитано 23.12.2012, 16:18
#5
Chip115


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


Заработало) Спасибо!
Еще можно вопрос?
Допустим я в кубе проделал сквозное отверстие. По команде area вычисляется площадь внешней поверхности куба+поверхность цилиндра, что образует отверстие. Так? Как сделать так, что бы вычислялась только поверхность куба, без площади поверхности цилиндра,который образован отверстием? Да, и еще вопрос. Как можно вычислить габаритные размеры например фронтальной проекции фигуры?
Скачал несколько книг, но там только 2D фигуры рассматриваются
Нашел вот такую штуку vla-GetBoundingBox. Думаю можно вытащить от сюда координаты угловых точек и по ним определить габаритные размеры. Буду экспериментировать.

Хочу пока выделить одну координату их трех. Не получается.
Код:
[Выделить все]
(vl-load-com)
(setq B (vlax-ename->vla-object (car(entsel))))
(vla-GetBoundingBox B 'minp 'maxp)
(print (vlax-safearray->list minp))
(setq xyz (vlax-safearray->list maxp))(terpri)
(princ (car'(xyz))
выводит вот что
(0.0 0.0 0.0)
; не верно сформирован список на входе.


Что не так?

Последний раз редактировалось Chip115, 23.12.2012 в 20:15.
Chip115 вне форума  
 
Непрочитано 23.12.2012, 21:15
#6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Для простоты нужно устанавливать систему координат
соответственно одной из граней объекта,
тогда получишь нормальные координаты
например так
Код:
[Выделить все]
(if (and (setq ent (entsel "Select 3d solid >>: "))
	  (eq "3DSOLID" (cdr (assoc 0 (entget (setq en (car ent)))))))
  (progn
    (setq solobj (vlax-ename->vla-object en))
    (vla-put-showhistory solobj :vlax-true);important if you will be edit this solid further
    (princ "\nSelect solid face to set new UCS: ")
    (command "._ucs" "_Face" pause "")
    (command "._ucsicon" "_on")
    (command "._vscurrent" "_3")
  (vla-GetBoundingBox solobj 'minp 'maxp)
(print (vlax-safearray->list minp))
(setq xyz (vlax-safearray->list maxp))(terpri)
(print (car xyz))
 (command "._ucs" "_Previous");restore old UCS
))
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 25.12.2012, 19:33
#7
Chip115


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


Все. Вроде задачу решил. Благодарю всех за помощь!
Chip115 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как определить площадь поверхности 3d Объекта? Autolisp.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание поверности и 3d модели поверхности в AutoCAD Civil 3d 2009 Arhistratig Вертикальные решения на базе AutoCAD 25 07.05.2013 14:53
AutoCAD Civil 3D 2010. Редактирование поверхности. rassom Вертикальные решения на базе AutoCAD 4 04.07.2012 15:01
Нужна помощь! 3D Поверхности Mouse AutoCAD 2 26.07.2006 12:53
вращение 3d объекта и его текстура при вращении pomka AutoCAD 7 08.12.2005 15:46