Тема: Box как определить координаты

С наступающим Новым годом!
Попытался в LIPS'е добраться до координат вершин примитивов:
(defun C:sx ()
  (setq sss (ssget))
  (setq na (ssname sss 0))
  (setq b (entget na))
)
Линия, круг ещё как-то понятно, а с Box'ом - на половину экрана какой-то бред.
Пока основная задача - получить координаты вершин Box'са построенного ACAD'ом.
Перспектива - в МАХ Вох'у сделан Edit Mesh, потом перекинут в ACAD и хочется получить координаты вершин этого тела.
Как грамотно добраться до вершин Box'са ?
Где это может быть описано подробно (на русском!). Или по каким ключевым словам искать?
Удачи всем в новом году!!!!!

Re: Box как определить координаты

Как грамотно добраться до вершин Box'са ?

Практически никак.
http://dwg.ru/forum/viewtopic.php?p=48912#48912 - это не единственная тема, ищи по ключевым словам lisp и 3dsolid

Где это может быть описано подробно

тут: http://dwg.ru/dwl/123

на русском!

а вот это вряд ли...
Желаю не заморачиваться в Новом году подобными вещами :))

Re: Box как определить координаты

Вот тут ковыряли :((
https://www.caduser.ru/forum/topic3998.html

Re: Box как определить координаты

Спасибо. Буду пробовать разобраться.
Хочу пожелать всем удачи во всех начинаниях ! !

Re: Box как определить координаты

VK!!! Огромное спасибо за такой прекрасный новогодний подарок. С очень многим мне ещё предстоит разобраться, но старт есть.

Re: Box как определить координаты

скачай с http://dwg.ru/dwl/123 (goacis) и
(acis-decode)
поменяй
(defun goACIS (/ ent entl) (setq length_koor_solid nil)
(cond ((setq ent (car (entsel)))
(setq entl (entget ent))
(foreach n entl
(if (= 1 (car n))
(if (= (substr (acis-decode (cdr n)) 1 5) "point")
(setq length_koor_solid (cons (acis-decode (cdr n)) length_koor_solid)))
)))))
загрузи
(defun koorZ_obj (/ chr32_id koorxyz length_koor_obj list_koor_xyz_3d i xyz_id is)
  (goacis)
  (foreach e length_koor_obj
    (setq koorxyz (substr e 11 (- (strlen e) 12))
      )
    (setq i 0 xyz_id 0 is 0)
    (repeat (strlen koorxyz)
      (setq chr32_id (substr koorxyz (setq i (1+ i)) 1)
        )
      (if (eq chr32_id (chr 32))
    (progn (setq xyz_id (1+ xyz_id))
      (cond
        ((= xyz_id 1) (setq koor_x (atof (substr koorxyz 1 i)) is i))
        ((= xyz_id 2) (setq koor_y (atof (substr koorxyz is i)) is i))
        );_end cond
      (setq koor_z (atof (substr koorxyz is)))
      );_end progn
    );_end if
      );_end repeat
    (setq list_koor_xyz_3d (cons (list koor_x koor_y koor_z) list_koor_xyz_3d)
      )
    );_end foreach
  )
(koorZ_obj)

Re: Box как определить координаты

PahRam пишет:

скачай...
поменяй...
загрузи...

А какую полезность можно получить из этих функций даже после устранения опечаток? Прошу привести рабочий пример.

Re: Box как определить координаты

Точно напартачил.
(setq length_koor_obj (cons (acis-decode (cdr n)) length_koor_obj))
Польза!?! А какая польза от того, что там выходит на экран после (enget (entlast)). Почему например не написать программу, которая выдавала бы на экран не бред, а список со свойствами, как у обычной линии. Почему такая разница в представлении данных?
А конкретная цель этой задача была определить вершины BOXа

Re: Box как определить координаты

А конкретная цель этой задача была определить вершины BOXа

Увы, цель не достигнута :(
Дело в том, что точки "point" совершенно не обязаны находиться в вершинах бокса. Попробуйте простой пример: постройте бокс (или поверните) так чтоб его грани НЕ были параллельны базовым плоскостям WCS и сравните что дает Ваша программа с реальными координатами.

Почему например не написать программу, которая выдавала бы на экран не бред

А собственно говоря, некоторая часть этой программы уже существует - это команда _.acisout, которая сбрасывает в текстовый файл описание тела (то самое, которое зашифровано в 1 группе DXF). Вторая часть - разбор граней, ребер, вершин - явно тянет не на одну сотню строк кода, судя по доке с http://dwg.ru/dwl/123
Впрочем, если ограничиться только боксом с гранями || базовым плоскостям WCS, то все проще. Для этого есть GetBoundingBox Method.

Re: Box как определить координаты

Проверил с BOXом не параллельным начальной WCS.
Всё Ок.
И со всеми выдавленными объектами проходит, где есть вершины.
Вот лучше скажите, почему не описать предположим region нормальным языком, как описание pline или spline. Какие припятствия?

Re: Box как определить координаты

Формат ACIS, который используется для описания геометрии, не Аутодесковый изначально. Видимо поэтому. Впрочем, есть другая мысль, что так называемый "зашифрованый" язык проще (или быстрее) обрабатывается.

Re: Box как определить координаты

Проверил с BOXом не параллельным начальной WCS. Снял координаты вершин ручками:

Command: '_id Specify point:  X = 0.0000     Y = 0.0000     Z = 0.0000
Command:  ID Specify point:  X = 17.3205     Y = 3.4202     Z = -9.3969
Command:  ID Specify point:  X = 17.3205     Y = 31.6110     Z = 0.8637
Command:  ID Specify point:  X = 0.0000     Y = 28.1908     Z = 10.2606
Command:  ID Specify point:  X = 20.0000     Y = -11.8479     Z = 32.5519
Command:  ID Specify point:  X = 37.3205     Y = -8.4277     Z = 23.1550
Command:  ID Specify point:  X = 37.3205     Y = 19.7631     Z = 33.4156
Command:  ID Specify point:  X = 20.0000     Y = 16.3429     Z = 42.8125

В конце программы добавил

  ) ;_end foreach
  [b](princ list_koor_xyz_3d)[/b]
) ;_  defun
(koorZ_obj)

И получил:

Select object: ((-1.0 0.0 37.3205) (-1.0 0.0 37.3205) (-1.0 0.0 17.3205) (-1.0 0.0 17.3205) (-1.0 0.0 20.0) (-1.0 0.0 20.0) (-1.0 0.0 0.0) (-1.0 0.0 -8.88178e-016))

Что то X влез вместо Z, а Y и Z потерялись... Почти получилось :)

Re: Box как определить координаты

Ай-яй-яй. Попробывал в AutoCAD2006 и сравнил с AutoCAD2000. Разные однако результаты.
Когда же они наконец определяться с выходными данными.
(foreach e length_koor_obj
    (setq koorxyz (substr e 18 (- (strlen e) 18))
Говоря о region, да и о других объектах, почему нельзя обращаясь к ним через (entget (entlast)) и при этом получать допустим следующее:
((-1 . <Entity name: 40036d60>) (0 . "region")...
и так далее. С описанием точек и минимальным набором параметров

Re: Box как определить координаты

Когда же они наконец определяться с выходными данными.

Видимо, разные версии. Притом, вроде как ACISOUTVER можно установить формат вывода в *.SAT, а внутренний формат хранения скорей всего не изменится.
Для 2005 так оно:

ACISOUTVER
Controls the ACIS version of SAT files created using the ACISOUT command. Currently, ACISOUT only supports a value of 15 through 18, 20, 21, 30, 40, 50, 60 and 70.

Может все таки есть смысл понизить версию и разбирать непосредственно текстовый файл?
И еще

(substr e 18

Откуда взят сей магический цифирь и для каких версий надежно пригоден?

Re: Box как определить координаты

Я думаю, что когда в ACAD2004 была применена собственная AutoDESK'овская система трехмерного моделирования на базе технологии ACIS, тогда и была изменена технология кодирования 3D-object.
Сей вывод делаю на основе эксперимента с 14 , 2000 и 2006 версиями. Результаты:
В ACAD14 и ACAD2000 версиях в sat-файле данные представлены так
point $-1 координаты
в ACAD2006
point $-1 -1 $-1 координаты
Ну думаю, что в дальнейшем такие сильные потрясения не предвидятся.
Кстати говоря, в ACAD14, в качестве полученного результата после процедуры (entget (entlast)), которая применялась к твёрдым объектам, выходит
(-1 . <Entity name: 3c20500>) (0 . "3DSOLID") (5 . "20") (100 . "AcDbEntity")
(67 . 0) (8 . "0") (100 . "AcDbModelerGeometry") (70 . 1) .....
да! Здесь выведенный на экран список имел логическую и информационную нагрузку. А шо щас?

Re: Box как определить координаты

> Alecs

> VK

> PahRam
Вот здеся посмотрите
http://autolisp.ru/dwlsp/27
(http://dwg.ru/forum/viewtopic.php?t=10126)