Convert 3D Polyline to 2D Polyline

There are various polyline types in AutoCAD®, the most common of which is usually the LWPolyline (lightweight polyline). It can be confusing because the LWPolyline and the old Polyline entity used way back in the early days of AutoCAD® are both shown as a «Polyline» in the Properties window. Chances are though, unless you’re working on some nasty generated drawing, you’re probably using LWPolylines.
The third polyline type is the 3D polyline, which as the name implies is a 3D version. Both the LWPolyline and the Polyline only permit the creation of geometry on a flat plane (UCS), but the 3D polyline allows points anywhere in 3D space.
Converting between the various types therefore has obvious difficulty, because going from 3D to 2D means you’re going to have to remove some of the 3D information from the polyline, and AutoCAD® could interpret how to do this in many ways. Therefore historically there have not been native commands to convert between the polyline types.
The FLATTEN command is an option for making the polyline flat (i.e., visibly the same as before, but drawn as a 2D line on whatever UCS you’re working on). I have had troubles with FLATTEN in the past however, because I think it does some odd stuff sometimes with merging lines and approximating. so I tend to avoid it where possible.
In most cases if I wanted to convert 3D to 2D, I’d do this:
- Explode the 3D Polyline ( ! )
- Select all of the Line entities we just created
- Go to the properties window
- Set the Z elevation of the start and end points of all lines to 0 (or whatever elevation you want)
- Use PEDIT to join all the lines together again
And then you’re left with a nice 2D Polyline again.
If at this point you then want to convert back to a 3D Polyline again, do the following:
- Gather up some raw materials
- Use them to build a time machine
- Go back in time to just before you did all of the above, and tell yourself to CREATE A COPY OF THE 3D VERSION FIRST!
- Return to the present, and use the line that now magically exists in the drawing
Alternatively you can avoid the inconvenience of mastering the laws of the space-time continuum by planning what you’re doing before you make any irreversible changes.
That’s all for today — if you haven’t already subscribed to my blog, join the other 340 who have! Holy-moly that’s a lot of people listening to my nonesense. !
Comments
john coon
2012-05-24 11:55:15
Will,
your readers should also try map clean up tools, and if in civil 3D under modify use to convert 3d to 2d
john
joan
2013-12-04 11:38:49
Преобразование 3D-полилиний в 2D
Для преобразования 3D в 2D полилинии используется команда «Преобразовать 3D полилинии в 2D» .
Новой полилинии присваивается отметка начальной точки 3D полилинии.

- Перейдите на вкладку «Редактирование» панель «Проектные данные» «Преобразовать 3D полилинии в 2D» найти .
- Выберите преобразуемые полилинии. Нажмите ENTER .
На уровень выше: Редактирование полилиний
Как качественно переводить 3d Polyline в обычную ?
Как качественно переводить 3d полилинию (вынутую из 3dsmax) в 2d полилинию? После применения команды flatten ее сильно коребит, разрывает и тд. Прикладываю пример: файл 3dsmax, файл автокад с исходным и переведенным узором.
| Узор.rar (270.4 Кб, 55 просмотров) |
Последний раз редактировалось EgorS, 14.04.2016 в 10:30 .
Просмотров: 11949
LISP, C# (ACAD 200[9,12,13,14])
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,656
Все нормально переводится.
| DWG 2013 | Узор.dwg (130.2 Кб, 98 просмотров) |
__________________
Моя библиотека lisp-функций
—
Обращение ко мне — на «ты».
Все, что сказано — личное мнение.
| Кулик Алексей aka kpblc |
| Посмотреть профиль |
| Посетить домашнюю страницу Кулик Алексей aka kpblc |
| Найти ещё сообщения от Кулик Алексей aka kpblc |
Регистрация: 16.01.2010
Сообщений: 65
Сообщение от Кулик Алексей aka kpblc
Все нормально переводится.
а что вы там перевели? 3d полилиния как была 3d так и осталась, автокад 2014. Нужно 3D Polyline перевести в обычную, чтоб потом выдавать этот файл для программы по лазерной резки.
PS: почему Бот закрыл аналогичную мою тему?? Я ее переименовал как он хотел, сейчас и эту хочет закрыть!
LISP, C# (ACAD 200[9,12,13,14])
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,656
Сорри, не тот файл закинул.
| DWG 2013 | Узор.dwg (138.5 Кб, 86 просмотров) |
__________________
Моя библиотека lisp-функций
—
Обращение ко мне — на «ты».
Все, что сказано — личное мнение.
| Кулик Алексей aka kpblc |
| Посмотреть профиль |
| Посетить домашнюю страницу Кулик Алексей aka kpblc |
| Найти ещё сообщения от Кулик Алексей aka kpblc |
Регистрация: 22.01.2013
Красноярск
Сообщений: 290
Кулик Алексей aka kpblc, а как ты это сделал?
У меня аналогичный результат получился после _explode и применения следующей команды (не помню где на форуме взял):
^C^C(defun C:JPL ( / ope ssnab )(setq ope (getvar "PEDITACCEPT"))(setvar "PEDITACCEPT" 1)(setq ssnab (ssget "_I"))(while (not ssnab)(setq ssnab (ssget)))(command "_pedit" "_Multiple" ssnab "" "_Join" 0 "")(setvar "PEDITACCEPT" ope)(setq ssnab nil)(princ));JPL;
Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
Форумы CADUser → Autodesk → AutoCAD → Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 13
#1 Тема от Сидор Лютый 6 апреля 2006г. 08:12:17
Тема: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
Подрядчики присылают чертежи с объектами, состоящими из 2D полилиний, а часть объектов того же самого типа состоит из 3D полилиний. При чем координаты Z такие, что возникает ощущение, что они вводятся случайно где-то на стадии экспорта из приборов, и различных геодезических программ, и подрядчики о их наличии в конечном .DWG совсем не подозревают.
В общем, приходиться обнулять координаты z, взрывать и вновь собирать взорванное в lwpolyline, так как в хелпе ничего не нашел по этому вопросу.. Расскажите пожалуйста, кто в курсе, как можно конвертировать 3dpline с нулевыми Z-координатами в 2dpline. Спасибо.
#2 Ответ от Vitalij 6 апреля 2006г. 08:19:26
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
#3 Ответ от kpblc 6 апреля 2006г. 08:20:27
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
flatten из Express Tools не срабатывает (только там с текстами и размерами не очень — их исключать из набора надо)?
#4 Ответ от Сидор Лютый 6 апреля 2006г. 08:35:48
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
> Vitalij
При выделении 3DPLine команда сообщает, что:
0 polyline objects converted
Что это значит? (никогда этой командой не пользовался, и в хелпе тоже почему-то ничего нет по ней:()
> kpblc
Как я понял, Flatten тоже только обнуляет Z, а объект по-прежнему остается 3DPLine. Для последующей программной обработки, мне нужно, чтобы они назывались так же, как и остальные:)
#5 Ответ от Владимир Громов 6 апреля 2006г. 08:41:07
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
> Сидор Лютый
Для того, чтобы 3D полилиния превратилась в полилинию, надо при использовании команды «flatten» ответить положительно на запрос об удалении скрытых линий.
#6 Ответ от Vitalij 6 апреля 2006г. 08:51:44
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
Недокументированная команда, узнал случайно, кстати, на ехтом форуме, проверял разные варианты, обнаружил, что не ковертирует 3d полилинии, отрисованные «вручную». У нас они появляются из некоей программы (через dxf). Иногда правда, тоже не срабатывает, но тогда помогает второй режим, той же команды (heavy)
#7 Ответ от Azor 6 апреля 2006г. 08:52:54
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
В Land Development есть такая функция. Convert to 2d polyline. Жмешь кнопку, выделяешь все, что есть на чертеже, и все 3д полилинии конвертятся в 2д. Только блоки предварительно расчленить нужно.
#8 Ответ от Сидор Лютый 6 апреля 2006г. 09:00:58
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
> Владимир Громов
Ага, пасиб, получилось. Да кстати, под запарку случайно не расскажете, что такое Hidden Lines?:) Встречал в Options, но так и не понял, что это такое..
> Vitalij
> Azor
Пасиб, тоже пригодится.
#9 Ответ от Сидор Лютый 6 апреля 2006г. 09:15:22
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
> Владимир Громов
Ааааа.. Поработал с flatten. После ее выполнения в плоскости XY вершины смещаются, при чем величина смещения зависит от зума!? Части полилиний, не попавших в экран, вообще исчезают!(. ) И это только если координаты Z у всех вершин равны нулю. А сли они не равны, 3DPLyne разрывается по границам объектов лежащих сверху по Z! (у меня в узлах блоки содержащие circle) Как это понимать?
#10 Ответ от Сидор Лютый 6 апреля 2006г. 09:19:26
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
> Vitalij
Не знаю, какими руками это сделано, но ни HEAVY, ни LIGHT не помогают:)
#11 Ответ от ABoltrushko 6 апреля 2006г. 09:38:07
Re: Как «3dPolyline» конвертировать в «2dPolyline», или в «lwpolyline»?
> Сидор Лютый
Попробуй эти варианты:
;; CVPOLY.LSP Copyright 1996, 1997 Tony Tanzillo all rights reserved
;;
;; Converts 3D polylines to 2D polylines that lie on
;; the XY plane of the current UCS.
(setq filter:3dpoly
‘( (-4 . »
(-4 . «&=»)
(70 . 8)
(-4 . «AND>»)
)
)
(defun get (key alist)
(cdr (assoc key alist))
)
(defun UCSZdir ()
(trans ‘(0 0 1) 0 1)
)
(defun UCSPoint2D (wcspoint)
( (lambda (p)
(list (car p) (cadr p) 0.0)
)
(trans wcspoint 0 1)
)
)
(defun mapvertex (e function / e d rslt)
(while (/= «SEQEND» (get 0 (setq d (entget (setq e (entnext e)) ‘(«*»)))))
(setq rslt
(cons
( (lambda (function data / e d rslt)
(apply function (list data))
)
function
d
)
rslt
)
)
)
(reverse rslt)
)
(defun cvpoly (pline / data ucs)
(setq data (entget pline ‘(«*»)))
(entmake
(subst
(cons 70 (logand (get 70 data) (~ 8)))
(assoc 70 data)
(subst
(cons 210 (setq ucs (ucszdir)))
(assoc 210 data)
(subst
‘(100 . «AcDb2dPolyline»)
‘(100 . «AcDb3dPolyline»)
data
)
)
)
)
(mapvertex pline
‘(lambda (data)
(if (zerop (logand (get 70 data) 9))
(entmake
(list
‘(0 . «VERTEX»)
‘(100 . «AcDbEntity»)
(assoc 8 data)
‘(100 . «AcDbVertex»)
‘(100 . «AcDb2dVertex»)
(cons 10 (UCSPoint2d (get 10 data)))
(cons 70 (logand (get 70 data) (~ 32)))
)
)
)
)
)
(entmake ‘((0 . «SEQEND»)))
(entdel pline)
)
(defun C:CVPOLY ( / ss i)
(cond
( (not (setq ss (ssget filter:3dpoly)))
(princ «\nNo 3D Polylines selected.»))
(t (setvar «CMDECHO» 0)
(command «._UNDO» «_Begin»)
(repeat (setq i (sslength ss))
(cvpoly (ssname ss (setq i (1- i))))
)
(command «._UNDO» «_En»)
)
)
(princ)
)
(princ «\nCVPOLY.LSP Copyright 1997 Tony Tanzillo»)
(princ «\nCVPOLY command loaded.»)
(princ)
————————————————
;;CADALYST 09/03 AutoLISP Solutions
;;; PLINE-3D-2D.LSP — a program to convert
;;; 3D polylines to 2D
;;; Program by Tony Hotchkiss
(defun pline-3d-2d ()
(vl-load-com)
(setq *thisdrawing* (vla-get-activedocument
(vlax-get-acad-object)
) ;_ end of vla-get-activedocument
*modelspace* (vla-get-ModelSpace *thisdrawing*)
) ;_ end of setq
(setq 3d-pl-list
(get-3D-pline)
) ;_ end of setq
(if 3d-pl-list
(progn
(setq vert-array-list (make-list 3d-pl-list))
(setq n (- 1))
(repeat (length vert-array-list)
(setq vert-array (nth (setq n (1+ n)) vert-array-list))
(setq lyr (vlax-get-property (nth n 3d-pl-list) ‘Layer))
(setq obj (vla-AddPolyline *modelspace* vert-array))
(vlax-put-property obj ‘Layer lyr)
) ;_ end of repeat
(foreach obj 3d-pl-list (vla-delete obj))
) ;_ end of progn
) ;_ end of if
) ;_ end of pline-3d-2d
(defun get-3D-pline ()
(setq pl3dobj-list nil
obj nil
3d «AcDb3dPolyline»
) ;_ end of setq
(setq selsets (vla-get-selectionsets *thisdrawing*))
(setq ss1 (vlax-make-variant «ss1»))
(if (= (vla-get-count selsets) 0)
(setq ssobj (vla-add selsets ss1))
) ;_ end of if
(vla-clear ssobj)
(setq Filterdata (vlax-make-variant «POLYLINE»))
(setq no-ent 1)
(while no-ent
(vla-Selectonscreen ssobj)
(if (> (vla-get-count ssobj) 0)
(progn
(setq no-ent nil)
(setq i (- 1))
(repeat (vla-get-count ssobj)
(setq
obj (vla-item ssobj
(vlax-make-variant (setq i (1+ i)))
) ;_ end of vla-item
) ;_ end of setq
(cond
((= (vlax-get-property obj «ObjectName») 3d)
(setq pl3dobj-list
(append pl3dobj-list (list obj))
) ;_ end of setq
)
) ;_ end-of cond
) ;_ end of repeat
) ;_ end of progn
(prompt «\nNo entities selected, try again.»)
) ;_ end of if
(if (and (= nil no-ent) (= nil pl3dobj-list))
(progn
(setq no-ent 1)
(prompt «\nNo 3D-polylines selected.»)
(quit)
) ;_ end of progn
) ;_ end of if
) ;_ end of while
(vla-delete (vla-item selsets 0))
pl3dobj-list
) ;_ end of get-3D-pline
(defun get-3D-pline-old ()
(setq no-ent 1)
(setq filter ‘((-4 . »
(70 . 8)
(-4 . «AND>»)
)
) ;_ end of setq
(while no-ent
(setq ss (ssget filter)
k (- 1)
pl3dobj-list nil
obj nil
3d «AcDb3dPolyline»
) ;_ end-of setq
(if ss
(progn
(setq no-ent nil)
(repeat (sslength ss)
(setq ent (ssname ss (setq k (1+ k)))
obj (vlax-ename->vla-object ent)
) ;_ end-of setq
(cond
((= (vlax-get-property obj «ObjectName») 3d)
(setq pl3dobj-list
(append pl3dobj-list (list obj))
) ;_ end of setq
)
) ;_ end-of cond
) ;_ end-of repeat
) ;_ end-of progn
(prompt «\nNo 3D-polylines selected, try again.»)
) ;_ end-of if
) ;_ end-of while
pl3dobj-list
) ;_ end of get-3D-pline-old
(defun make-list (p-list)
(setq i (- 1)
vlist nil
calist nil
) ;_ end of setq
(repeat (length p-list)
(setq obj (nth (setq i (1+ i)) p-list)
coords (vlax-get-property obj «coordinates»)
ca (vlax-variant-value coords)
) ;_ end-of setq
(setq calist (append calist (list ca)))
) ;_ end-of repeat
) ;_ end-of make-list
(defun c:pl32 ()
(pline-3d-2d)
(princ)
) ;_ end of pl32
(prompt «Enter PL32 to start: «)