Архитектору и проектировщику|Тепло- и звукоизоляция URSA.RU
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP - 2D полилинию в 3D

LISP - 2D полилинию в 3D

Ответ
Поиск в этой теме
Непрочитано 16.08.2009, 14:35 #1
LISP - 2D полилинию в 3D
Andrej
 
Регистрация: 16.08.2009
Сообщений: 2

Как перевести полилинию в 3D полилинию, чтобы каждая вершина этой полилинии приняла за высотную отметку значение ближайшего к ней (к вершине) текста. Текст это высотная отметка, например "459.7"
Просмотров: 5398
 
Непрочитано 17.08.2009, 00:35
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


А у каждой вершины 100% есть обозначение? Или все таки есть максиальное расстояние до текста? А если его нет что делать?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.08.2009, 00:38
#3
Кулик Алексей aka kpblc
Moderator

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


Дополнительно: а 2D-полилиния сделана только в мировой системе координат или возможны варианты? А Elevation для этой полилинии всегда 0? А что делать с дуговыми сегментами? А полилиния только в пространстве модели или, опять-таки, возможны варианты? А полилиния точно не входит в какой-нибудь блок или внешнюю ссылку?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.08.2009, 03:10
#4
Andrej


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


Обычная полилиния, сделана в мировой системе, уровень не обязательно 0, но один для всей полилинии, дуговых сегментов нет, в пространстве модели, она не входит ни в блок ни во внешнюю ссылку.
Andrej вне форума  
 
Непрочитано 17.08.2009, 08:21
#5
Кулик Алексей aka kpblc
Moderator

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


Я бы на твоем месте, Andrej, приложил файл-образец. А то гадать можно до бесконечности...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.08.2009, 12:39
1 | #6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Цитата:
Сообщение от Andrej Посмотреть сообщение
Обычная полилиния, сделана в мировой системе, уровень не обязательно 0, но один для всей полилинии, дуговых сегментов нет, в пространстве модели, она не входит ни в блок ни во внешнюю ссылку.
Ну если так - держи:
Код:
[Выделить все]
(vl-load-com)
(defun c:test ( / digit pln lst)
(setq	digit	(vl-remove nil (mapcar '(lambda (text / dgt)
		(if (setq dgt (digitextract (cod 1 text))) (cons (cod 10 text) (car dgt)))
		);end of lambda
                 (vl-remove-if-not '(lambda (obj) (digit? (cod 1 obj)))
		(sstolist (ssget "_a" (list (cons 0 "*text"))))
		)));end of mapcar & vl-remove & vl-remove-if
	pln	(car (entsel "Выберите полилинию"))
	lst	(if (= (cod 0 pln) "LWPOLYLINE") (pltolist pln) 
			(if (= (cod 0 pln) "POLYLINE") (3dplntolist pln) (progn (princ "\nЭто не полилиния") nil)
				));end of if*2
        mnojitel_vysoty (if (not mnojitel_vysoty) 1 mnojitel_vysoty)
	pribavka_vysoty (if (not pribavka_vysoty) 0 pribavka_vysoty)
);end of setq
(if lst (progn
(vla-startundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
(entmakex (list (cons 0 "POLYLINE") (cons 100 "AcDb3dPolyline") '(10 0 0 0) (cons 70 8)))
(mapcar '(lambda (pt / tmp)
(entmakex (list (cons 0 "VERTEX") (cons 100 "AcDb3dPolyline") (cons 10 (list (car pt) (cadr pt)
(+ pribavka_vysoty (* mnojitel_vysoty (if (setq tmp (cdr (car (vl-sort digit '(lambda (x y) (< (distance pt (car x)) (distance pt (car y)))))))) tmp 0)))
)) (cons 70 32)
));end of entmakex
);end of lambda
lst
);end of mapcar
(entmakex (list (cons 0 "SEQEND")))
(entdel pln)
(vla-endundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
));end of progn & if
(princ)
);end of defun

(defun digit? (str)
(apply 'and
(mapcar '(lambda (sym) (or (= sym 44) (= sym 46) (= sym 32) (and (> sym 47) (< sym 58)))) (vl-string->list str)))
);end of digit

(defun c:testinit ( / tmp)
(setq 
mnojitel_vysoty (if (not mnojitel_vysoty) 1 mnojitel_vysoty)
pribavka_vysoty (if (not pribavka_vysoty) 0 pribavka_vysoty)
mnojitel_vysoty (if (setq tmp (getreal (strcat "\nВведите множитель высоты <текущее значение " (rtos mnojitel_vysoty) "> "))) tmp mnojitel_vysoty)
pribavka_vysoty (if (setq tmp (getreal (strcat "\nВведите прибавку высоты <текущее значение " (rtos pribavka_vysoty) "> "))) tmp pribavka_vysoty)
);end of setq
(princ)
);end of testinit

(defun pltolist (obj / tmp); возращает список координат вершин полилинии
(if (= (cod 0 obj) "LWPOLYLINE")
(mapcar '(lambda (x) (trans (append (cdr x) (list (cod 38 obj))) (cod 210 obj) 0)) (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget obj)))
);end of if
);end of pltolist

(defun 3dplntolist (pln / lst); возращает список координат вершин 3Д полилинии
(if (= (cod 0 pln) "POLYLINE")
(while (/= (cod 0 pln) "SEQEND")
(setq	lst (cons (cod 10 pln) lst)
	pln (entnext pln)
);end of setq
));end of while & if
(cdr (reverse lst))
);end of 3dplntolist

(defun sstolist (ss / i lst); конвертирует набор в список
(setq i 0)
(if ss
(repeat (sslength ss)
(setq lst (append lst (list (ssname ss i))) i (1+ i))
));end of repeat & if
lst
);end of sstolist

(defun cod (cd obj) ; возращает код cd примитива obj.
(if (and obj (= (type obj) 'ename))
(cdr (assoc cd (entget obj)))
));end of cod

;возращает список цифр содержащихся цифр в строке
(defun digitextract (str / lstdgt digit char i)
(setq i 1 digit "")
(repeat (strlen str)
(setq char (substr str i 1))
(if 	(and (>= char "0") (<= char "9"))
	(setq digit (strcat digit char))
	(if (or (= char ".") (= char ","))
	(setq digit (strcat digit "."))
	(if (= digit ".") (setq digit "") 
	(if (/= digit "") (setq lstdgt (append lstdgt (list (atof digit))) digit ""))
)));end of if*3
(setq i (1+ i))
);end of repeat
(if (and (/= digit ".") (/= digit "")) (setq lstdgt (append lstdgt (list (atof digit)))))
lstdgt
);end of digitextract
P.S. Запускать командой test.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 20.08.2009 в 22:16.
Дима_ вне форума  
 
Непрочитано 19.08.2009, 12:45
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Дима_, добавь к функции два аргумента - множитель и прибавку, а то, геоподоснова 1:1, то есть в миллиметрах, а отметки высот в метрах над уровнем моря. Множитель переведет уровень в миллиметры, а прибавка (которая может быть как +, так и -) опустит общий рельеф на заданный уровень.
Очень полезная вещь получится.

Да, еще забыл. Добавь анализ запятой, если знаки разделены запятой, то переделать на точку.
Supermax вне форума  
 
Непрочитано 19.08.2009, 21:29
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Супермакс - за твой вклад в параметры видимости - любые капризы (исправленние выделенно) - задавать параметры - testinit. Про запятую - я как обычно не понял что нужно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.08.2009, 11:49
#9
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Дима_, огромное спасибо! В процессе работы c:test, надо чтобы выводилось через princ значение переменных mnojitel_vysoty и pribavka_vysoty, будет круче чем в Автокадовских аналогичных подходах.
Все служебные функции я бы упрятал внутрь c:test, а саму c:test уже нужно переименовать во что-то более понятное. Да и оформить как программу и положить в библиотеку готовых программ.


P.S. Так бывает, что на геоподоснове очень часто отметки высот указываются через запятую. Я конечно могу все тексты махом перелопатить и поменять запятую на точку, но по правилам, я не имею права вносить в геоподоснову изменения. Потом, тексты бывают разные. Рядом с вершиной может лежать и обычный текст, и отметка уровня дна колодца (123.45 лот.) и отметка верха трубы (123.45 в.тр.) и всякое другое, а надо выбирать только 123.4 или 123,4 или 123.45 или 123,45 или 123.456 или 123,456 короче прировнять точку и запятую к цифре и проверить, чтобы вся строка состояла из цифр.
С М-текстом тоже надо работать.
А так - очень простая и гениальная идея реализована.

Последний раз редактировалось Supermax, 20.08.2009 в 11:59.
Supermax вне форума  
 
Непрочитано 20.08.2009, 17:22
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


По поводу запятых - программе абсолютно все равно будет-то 123.45 или 123,45 - "проглотит" обе цифры - по поводу отбирать только цифры - ихмо сделать можно, но возможны баги с пробелами и пр - тут надо хорошенько продумать - ихмо выбирать самую ближнию цифру (не важно в каком формате) - надежней. По поводу объединения если есть красивые идеи - изложи подробно, т.к. мой взгляд на GUI классическим не назвать (с DCL не работал и как-то не планирую).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.08.2009, 19:31
#11
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,382


а окончательный вариант программы будет, с пояснениями? а то я, честно говоря, не понял какие множители подставлять
Рyslan вне форума  
 
Непрочитано 20.08.2009, 20:07
#12
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
По поводу запятых - программе абсолютно все равно будет-то 123.45 или 123,45 - "проглотит" обе цифры - по поводу отбирать только цифры - ихмо сделать можно, но возможны баги с пробелами и пр - тут надо хорошенько продумать - ихмо выбирать самую ближнию цифру (не важно в каком формате) - надежней. По поводу объединения если есть красивые идеи - изложи подробно, т.к. мой взгляд на GUI классическим не назвать (с DCL не работал и как-то не планирую).
Не, не, не. Не надо вообще обрабатывать то, что имеет в своем составе буквы. Только голые цифры. Возможно там могут после цифр пробелы маячить, вот их можно и пропустить. Мало ли кто отметку ставил и пробел после цифры впихнул, а вот если буквы появились - не принимать в обработку всю строку вместе с цифрами. На геоподосновах отметки уровня поверхности земли только цифрами обозначены.
Особо в текст лиспа не вникал и поэтому интересуюсь, если я слои повыключаю лишние, из них тексты не будут мешать работе проги?

Рyslan, на геоподосновах уровень указан в метрах от уровня моря, к примеру 173.46, что означает 173 метра и 46 сантиметров. А масштаб геоподосновы скажем 1:1, то есть проводимые тобою линии будут исчисляться в миллиметрах, значит надо 173.46 умножить на 1000, но тогда все линии подпрыгнут по Z аж на 173 метра вверх. Значит, надо дать прибавку скажем -170 и наш рельеф опустится на приемлемую высоту при просмотре сбоку.
Supermax вне форума  
 
Непрочитано 20.08.2009, 20:40
#13
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,382


у этих геодезистов куча масштабов, вертикальный, горизонтальный по горизонту 1:100, по вертикали 1:50
Рyslan вне форума  
 
Непрочитано 20.08.2009, 22:20
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Исправил курсивом - особо не гонял теперь по идее только строки с голыми цифрами идут в расчет - то есть годными признаються только символы " .,0123456789" - всех кодов не знаю посему и двухстрочные или с другим форматированием тоже игноряться.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.04.2019, 09:31
#15
hroost

Проектирование
 
Регистрация: 01.09.2009
Сообщений: 16


Добрый день! А как сделать чтобы код из сообщение#6 за координаты вершины 3d-полилинии принимался не текст, а координаты кажущегося пересечение с 2D полилиниями (горизонталями рельефа), естественно находящимися на разных высотах?


Вложил пример в файле
Вложения
Тип файла: dwg
DWG 2013
test.dwg (343.3 Кб, 4 просмотров)

Последний раз редактировалось hroost, 24.04.2019 в 12:30.
hroost вне форума  
 
Непрочитано 24.04.2019, 09:50
#16
trir


 
Регистрация: 18.12.2010
Сообщений: 3,381


Цитата:
А как сделать чтобы за координаты вершины 3d-полилинии принимался не текст, а координаты кажущегося пересечение с 2D полилиниями (горизонталями рельефа), естественно находящимися на разных высотах?
использовать Civil 3D
trir вне форума  
 
Непрочитано 24.04.2019, 11:07
#17
hroost

Проектирование
 
Регистрация: 01.09.2009
Сообщений: 16


Необходимо под автокадом и в среде lisp, на примере сабжевой программы
hroost вне форума  
 
Непрочитано 24.04.2019, 11:50
1 | 1 #18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 6,642


Цитата:
Сообщение от hroost Посмотреть сообщение
Необходимо под автокадом и в среде lisp, на примере сабжевой программы
Образец файла выложите: даже если кто-нибудь из пишущих на лиспе и захочет "размяться" - ему за вас и исходные данные придумывать?
Сергей812 вне форума  
 
Непрочитано 24.04.2019, 12:17
#19
hroost

Проектирование
 
Регистрация: 01.09.2009
Сообщений: 16


Я так понимаю что решение здесь http://forum.dwg.ru/showpost.php?p=801611&postcount=6
"Основная идея проста: все нужные примитивы проецируются на плоскость полилинии, получаем точки пересечения, потом примитивы обратно и получаем расстояние от вычисленной точки до примитива. Это и будет высота расположения примитива над полилинией в указанной точке. А дальше строишь все чего хочется." (С)


Но к сожаление моих познаний в лиспе не хватает для воплощения этой идеи даже на примере сабжевого кода.
Вложил пример файла
Вложения
Тип файла: dwg
DWG 2013
test.dwg (343.3 Кб, 9 просмотров)

Последний раз редактировалось hroost, 24.04.2019 в 12:30.
hroost вне форума  
 
Непрочитано 25.04.2019, 09:31
#20
koMon


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


Цитата:
Сообщение от hroost Посмотреть сообщение
Вложил пример
в примере есть профили, оформленные в виде блоков. эти блоки кто сгенерил?
а вообще профили строятся выпрямленными?
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP - 2D полилинию в 3D

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в 3D зделать полилинию, что бы она стала трубой не целиндром а изогнутой Denis DWG AutoCAD 31 07.05.2009 16:19
Lisp Как поставить диаметр отверстия на 3D solidе P4s8x LISP 4 06.11.2008 19:31
3d max: Генерация из 3D в 2D Малюк Другие CAD системы 2 21.02.2008 15:32
Тень от 3D обьекта на 2D и др. вопросы в AutoCad 2007 Sergunya AutoCAD 7 25.12.2006 09:47
3D => 2D Grinzaid AutoCAD 10 02.02.2005 17:49