Forge, API и программирование – Русский – только для чтения
Задавайте вопросы и делитесь знаниями по Autodesk Forge и программированию на API программного обеспечения Autodesk
отмена
Отображаются результаты для 
Показать  только  | Вместо этого искать 
Вы имели в виду: 

Как разбить МПолигоны

17 ОТВЕТ 17
РЕШЕНО
Ответить
Сообщение 1 из 18
Anonymous
6832 просмотров, 17 ответов

Как разбить МПолигоны

Подскажите, пожалуйста, имею в чертеже огромное количество МПолигонов. Возможно ли автоматически преобразовать МПолигон в замкнутую полилинию и заливку с цветом МПолигона? Спасибо.

17 ОТВЕТ 17
Сообщение 2 из 18
Anonymous
в ответ: Anonymous

задача решаема, добавьте в тему еще один примерчек, где будет несколько "MPOLYGON"  с различным количеством вершин. Вчерновую уже готово...

Сообщение 3 из 18
Anonymous
в ответ: Anonymous

 

(defun c:test (/ V)
  (if (setq v (ssget "_x" '((0 . "MPOLYGON"))))
    (foreach e (mapcar (function cadr) (ssnamex v))
      (setq e (entget e)
            v (cons 0 (mapcar (function -) (cdr (assoc 11 e)) (cdr (assoc 10 e))))
      )
      (entmakex (append (list '(0 . "LWPOLYLINE")
                              '(100 . "AcDbEntity")
                              (assoc 67 e)
                              '(410 . "Model")
                              (assoc 8 e)
                              (assoc 62 e)
                              '(100 . "AcDbPolyline")
                              (cons 90 (cdr (assoc 93 e)))
                              '(70 . 1)
                        )
                        (mapcar (function (lambda (a) (mapcar (function +) a v)))
                                (cdr (vl-remove-if-not (function (lambda (a) (= (car a) 10))) e))
                        )
                        (list (assoc 210 e))
                )
      )
    )
  )
  (princ)
)

 

выкладываю код как есть, почти без проверок...

Сообщение 4 из 18
Anonymous
в ответ: Anonymous

Евгений, извините за задержку. Эту задачу нам придется выполнять каждый день, так как база обновляется каждый день. Полилиния должна иметь цвет контура мполигона, а цвет штриховки должен быть как цвет заполнения мполигона. Тип как у полигона. Спасибо!

Сообщение 5 из 18
Anonymous
в ответ: Anonymous

Евгений, вылетает ошибка

Команда: _test
; ошибка: неверная DXF-группа: nil

Сообщение 6 из 18
Anonymous
в ответ: Anonymous

(defun c:t1 (/ V)
  (if (setq v (ssget "_x" '((0 . "MPOLYGON"))))
    (foreach e (mapcar (function cadr) (ssnamex v))
      (setq e (entget e)
            v (cons 0 (mapcar (function -) (cdr (assoc 11 e)) (cdr (assoc 10 e))))
      )
      (entmakex
        (vl-remove nil
                   (append (list '(0 . "LWPOLYLINE")
                                 '(100 . "AcDbEntity")
                                 (assoc 67 e)
                                 '(410 . "Model")
                                 (assoc 8 e)
                                 (assoc 62 e)
                                 '(100 . "AcDbPolyline")
                                 (cons 90 (cdr (assoc 93 e)))
                                 '(70 . 1)
                           )
                           (mapcar (function (lambda (a) (mapcar (function +) a v)))
                                   (cdr (vl-remove-if-not (function (lambda (a) (= (car a) 10))) e))
                           )
                           (list (assoc 210 e))
                   )
        )
      )
    )
  )
  (princ)
)
(defun c:t2 (/ V)
  (if (setq v (ssget "_x" '((0 . "MPOLYGON"))))
    (foreach e (mapcar (function cadr) (ssnamex v))
      (setq e (entget e)
            v (cons 0 (mapcar (function -) (cdr (assoc 11 e)) (cdr (assoc 10 e))))
      )
      (entmakex
        (vl-remove nil
                   (append (list '(0 . "LWPOLYLINE")
                                 '(100 . "AcDbEntity")
                                 (assoc 67 e)
                                 '(410 . "Model")
                                 (assoc 8 e)
                                 (assoc 62 e)
                                 '(100 . "AcDbPolyline")
                                 (cons 90 (cdr (assoc 93 e)))
                                 '(70 . 1)
                           )
                           (mapcar (function (lambda (a) (mapcar (function +) a v)))
                                   (cdr (vl-remove-if-not (function (lambda (a) (= (car a) 10))) e))
                           )
                           (list (assoc 210 e))
                   )
        )
      )
      (entdel (cdar e))
    )
  )
  (princ)
)

 программа t1 добавляет полилинии, t2 добавляет полилинии и удаляет полигоны. Предыдущая программа работала на данном вами примере...

Сообщение 7 из 18
Anonymous
в ответ: Anonymous

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

Это уже действительно беда! Эти полигоны были разработаны для решения задач, которые не решаются штриховками, те. в штриховке не может быть совпадающих точек, самопересечений итд. Штриховка поддерживает только внешние и внутренние контура, при пересечении внешних и внутренних контуров, она автоматом вычисляет новые контура без самопересечений  (но только если не очень сложно). Другими словами, перевод МПолигонов в полилинию и штриховку возможен только в частном случае...

 

И еще, моя программа вытаскивает из полигона все точки и генерит по ним полилинию, уберая лишние точки, попадающие во внутренние контура, те. на данный момент программа работает не верно для полигонов с отверстиями. Чуть позже поправлю.

Сообщение 8 из 18
Anonymous
в ответ: Anonymous

Евгений, было бы здорово чтобы полилинии которые создаются по команде _t1 имели цвет закрашивания МПолигона и чтобы мполигон заменялся просто штриховкой цвета и типа Мполигона.

Сообщение 9 из 18
Anonymous
в ответ: Anonymous

Вроде сделал. Тестируйте. Веселый

 

 

(defun c:mp2p (/ L LL LST P V)
  ;; by ElpanovEvgeniy
  ;; convert MPolygon to Lwpolyline
  ;; version 0.2
  ;; 2012.07.11
  ;; mailto: elpanov@gmail.com
  ;; web:    elpanov.com
  (if (setq v (ssget "_x" '((0 . "MPOLYGON"))))
    (foreach e (mapcar (function cadr) (ssnamex v))
      ;;(setq e(car(entsel)))
      (setq e   (entget e)
            v   (cons 0 (mapcar (function -) (cdr (assoc 11 e)) (cdr (assoc 10 e))))
            l   (vl-remove nil
                           (list '(0 . "LWPOLYLINE")
                                 '(100 . "AcDbEntity")
                                 (assoc 67 e)
                                 (assoc 410 e)
                                 (assoc 8 e)
                                 (if (assoc 63 e)
                                   (cons 62 (cdr (assoc 63 e)))
                                 )
                                 (if (assoc 421 e)
                                   (cons 420 (cdr (assoc 421 e)))
                                 )
                                 '(100 . "AcDbPolyline")
                           )
                )
            lst e
            ll  nil
      )
      (defun f (l i)
        (if (> i 0)
          (cons (mapcar (function +) (car l) v) (f (cdr l) (1- i)))
        )
      )
      (while (setq lst (member (assoc 93 (cdr lst)) (cdr lst)))
        (setq p  (f (cdr lst) (cdar lst))
              ll (append ll (list '(92 . 7) '(72 . 0) '(73 . 1) (car lst)) p '((97 . 0)))
        )
        (entmakex (vl-remove nil (append l (list (cons 90 (cdar lst)) '(70 . 1)) p (list (assoc 210 e)))))
      )
      (entmakex (vl-remove nil
                           (append (list '(0 . "HATCH")
                                         '(100 . "AcDbEntity")
                                         (assoc 410 l)
                                         (assoc 8 l)
                                         (assoc 62 l)
                                         (assoc 420 l)
                                         '(100 . "AcDbHatch")
                                         (assoc 10 e)
                                         (assoc 210 e)
                                         '(2 . "SOLID")
                                         (assoc 70 e)
                                         (assoc 71 e)
                                         (assoc 91 e)
                                   )
                                   ll
                                   (list '(75 . 0)
                                         '(76 . 1)
                                         '(47 . 1.)
                                         '(98 . 2)
                                         '(10 0. 0. 0.0)
                                         '(10 0. 0. 0.0)
                                         '(450 . 0)
                                         '(451 . 0)
                                         '(460 . 0.0)
                                         '(461 . 0.0)
                                         '(452 . 0)
                                         '(462 . 0.0)
                                         '(453 . 2)
                                         '(463 . 0.0)
                                         '(63 . 256)
                                         '(463 . 1.0)
                                         '(63 . 256)
                                         '(470 . "LINEAR")
                                   )
                           )
                )
      )
    )
  )
  (princ)
)

 

Сообщение 10 из 18
Anonymous
в ответ: Anonymous

Евгений, спасибо Вам!!!!! Работает. Буду тестировать!!!!!! Ура!

Сообщение 11 из 18
Anonymous
в ответ: Anonymous

Не забудь отписаться, чем закончилось тестирование! Если все ок, выстави балы, у меня их пока нет, я уже много лет не заходил на этот форум...

Тогда, еще не придумали баллы, а я тоже хочу! Веселый

Сообщение 12 из 18
Anonymous
в ответ: Anonymous

Хорошо! Спасибо Вам!

Сообщение 13 из 18
Olga_Shevchenko
в ответ: Anonymous

Тоже затестила, ошибок не выявилось пока. Все отлично.

Вот сделать бы еще обратное преобразование 🙂 Автокадовскую штриховку переделать в МПолигоны также с сохранением стилей и поддержкой многоконтурности. Это возможно?

Сообщение 14 из 18
Anonymous
в ответ: Olga_Shevchenko

Спасибо за тесты!

Оля, ты  же сама рассказывала, что МПолигоны поддерживают дуговые сегменты...

Моя программа, сейчас обрабатывает только линейные сегменты!

 

По обратной обработке:

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

Со штриховками все сложнее:

1. штриховки поодерживают разрозненные области, причем каждая из них поддерживает отверстия с остравками.

2. штриховки моут ограничиваться линейными, дуговыми, эллиптическими и сплайновыми кривыми.

 

Другими словами, не в любом случае можно создать по штриховке МПолигон. В некоторых случаях, придется выполнять апроксимацию, т.е упрощение геометрии...

Сообщение 15 из 18
Olga_Shevchenko
в ответ: Anonymous

это приемлемо, особенно если апроксимизация управляемая

Сообщение 16 из 18
sertor
в ответ: Anonymous

Доброго времени суток. У меня ворок к тем форумчанам, кто тестировал вышеуказанный лисп. А сохраняется ли прозрачность после преобразования МПолигона?

Сообщение 17 из 18
АлексЮстасу
в ответ: Anonymous

Можно сделать сохранение типов штриховок (конкретных pattern), а не только цвета?


-- Alexander, private person, pacifist, english only with translator 🙂 --

Object-modeling _ odclass-odedit.com _ Help

Сообщение 18 из 18

И можно сделать штриховки ассоциативными с их контурами?


-- Alexander, private person, pacifist, english only with translator 🙂 --

Object-modeling _ odclass-odedit.com _ Help

Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.

Новая тема  

Autodesk Design & Make Report