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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Создание Lisp для расчета глубины траншеи

Создание Lisp для расчета глубины траншеи

Ответ
Поиск в этой теме
Непрочитано 21.03.2016, 15:58 #1
Создание Lisp для расчета глубины траншеи
Тимур С.
 
Регистрация: 09.03.2016
Сообщений: 4

Здравствуйте. Занимаюсь проектированием трубопроводов. Постоянно возникает необходимость в выводе данных о глубине траншеи. Т.е. имеется профиль с полилинией земли и полилиниями, обозначающими трубопровод. Для сметного отдела мы должны предоставлять данные по разработке траншеи в виде: разработка траншеи глубиной до 1,2 м, до 1,4 м и т.д с шагом 0,2 м. Вручную считать долго и не точно, особенно если трасса измеряется десятками километров.
В связи с этим возникла идея сделать LISP. Алгоритм примерно следующий. Выбирается полилиния, обозначающая землю, полилиния обозначающая низ трубы. Задаются точки начала и конца трассы. Задается горизонтальный и вертикальный масштаб. После этого программа начинает замерять расстояние по вертикали от линии низа трубы до линии земли с заданным горизонтальным шагом (например 0.01 м) от начальной до конечной точки и выводит данные в виде : глубина до 1.2 м- ххх метров, 1,4 м- ууу метров и т.д. Если трубопровод выходит на поверхность, вычисляет длину надземной части.
Пытаюсь освоить Autolisp, но процесс идет с большим трудом. В программировании что-то я не силен.
Застрял в самом начале. Не знаю как сделать чтобы LISP замерял расстояние между двумя точками полилиний.
Может кто-нибудь сможет помочь советом, или может есть какие-то заготовки?
Образец профиля прилагаю. Заранее спасибо.

Вложения
Тип файла: dwg
DWG 2007
профиль.dwg (961.3 Кб, 33 просмотров)

Просмотров: 4029
 
Непрочитано 21.03.2016, 17:46
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


1. Выкладывайте что уже сотворили.
2. Читайте тему: http://forum.dwg.ru/showthread.php?t=22894
3. У Вас в таблице есть все необходимые данные, глубина и расстояние, зачем Вам полилиния непонятно.
4. Импортируйте текстовые данные и фильтрацией по Х координате в Excel и там считайте.

А так это очень похоже не вежливую просьбу написать все за Вас, это во первых, а во вторых, смысла писать велосипед пока не вижу.
Boxa вне форума  
 
Непрочитано 21.03.2016, 18:20
#3
engngr

сети
 
Регистрация: 03.11.2008
Московия*
Сообщений: 5,782


Обвести полилинией профиль от планировки до дна траншеи, посмотреть площадь и умножить её на ширину траншеи. А вообще есть специализированные программы для подсчета объёмов пос.
upd: профиль делается вручную или в вертикальном приложении?
engngr вне форума  
 
Непрочитано 21.03.2016, 19:23
#4
trir


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


Civil 3D
trir на форуме  
 
Непрочитано 21.03.2016, 21:42
#5
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Алгоритм для лиспа.
1. Выбираешь две полилинии: отметки земли и дно траншеи.
2. Строишь вертикальные отрезки (вдоль трассы) с нужным шагом, которые заведомо пересекаются с этими полилиниями.
3. Определяешь точки пересечения отрезка с этими профилями.
4. По двум точкам находишь длину (глубину траншеи) и считаешь количество нужных расстояний.

Последний раз редактировалось Кулик Алексей aka kpblc, 21.03.2016 в 22:12.
Puroshev вне форума  
 
Автор темы   Непрочитано 22.03.2016, 08:21
#6
Тимур С.


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


Профиль делается в программе Трубопровод 2012. В ней есть функция вывода глубин траншеи, но лицензий у нас немного и часто нет доступа к программе.
Через площадь, умноженную на ширину мы получим разработку в м3, а мне нужно в метрах.
Puroshev, в общем-то вопрос сводится к тому, что я не знаю как замерить расстояние между двумя полилиниями. Если и провожу вертикальные прямые с шагом, то как найти их точки пересечения с полилиниями? Функция INTERS работает только с отрезками, я так понимаю.
Тимур С. вне форума  
 
Непрочитано 22.03.2016, 13:05
#7
engngr

сети
 
Регистрация: 03.11.2008
Московия*
Сообщений: 5,782


Ок, не объём. Тогда другой кустарный способ: создаете массив из вертикальных отрезков с определенным шагом, взрываете, обрезаете из снизу - трубой, сверху - планировкой, из оставшихся отрезков извлекаете длины и обрабатываете в екселе.
engngr вне форума  
 
Непрочитано 22.03.2016, 13:21
#8
trir


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


находим уравнение прямой...
trir на форуме  
 
Непрочитано 23.03.2016, 01:04
#9
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Тимур С. Посмотреть сообщение
Пытаюсь освоить Autolisp, но процесс идет с большим трудом. В программировании что-то я не силен.
Застрял в самом начале. Не знаю как сделать чтобы LISP замерял расстояние между двумя точками полилиний.
Эта задачка явно не для начинающего лиспера.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 23.03.2016, 07:06
#10
Тимур С.


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


Вот это звучит неплохо! Попробую, спасибо!
Цитата:
Сообщение от engngr Посмотреть сообщение
Ок, не объём. Тогда другой кустарный способ: создаете массив из вертикальных отрезков с определенным шагом, взрываете, обрезаете из снизу - трубой, сверху - планировкой, из оставшихся отрезков извлекаете длины и обрабатываете в екселе.
Тимур С. вне форума  
 
Непрочитано 23.03.2016, 08:42
#11
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Пересечение можно попробовать найти с помощью метода vla-intersectwith
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 23.03.2016, 09:03
#12
Тимур С.


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


Спасибо!
Тимур С. вне форума  
 
Непрочитано 23.03.2016, 12:17
#13
Владимир_М


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


Цитата:
Сообщение от Тимур С. Посмотреть сообщение
, из оставшихся отрезков извлекаете длины и обрабатываете в екселе.
Мне кажется с задачкой: распределить длины по разным диапазонам и сложить их, можно внутри Lisp-приложения, без подключения excell.
Владимир_М вне форума  
 
Непрочитано 23.03.2016, 22:32
#14
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Тимур С. Посмотреть сообщение
Если и провожу вертикальные прямые с шагом, то как найти их точки пересечения с полилиниями? Функция INTERS работает только с отрезками, я так понимаю.
Здесь есть набор готовых функций
Цитата:
MeGetInters - Returns all intersection points between two objects
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.03.2016, 06:04
#15
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,826


Цитата:
Сообщение от VVA Посмотреть сообщение
Здесь есть набор готовых функций
Спасибо. Посмотрел функцию MeGetInters. Можно вопрос. Там в аргументах функции cond есть такое выражение "(T nil)", какой в этом смысл? "T" ведь не функция, что она делает? Или это просто, чтобы что то было?
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 24.03.2016, 08:26
#16
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Пример получения точки пересечения 2-х объектов
Код:
[Выделить все]
 (defun c:INT2 (/ INTC INTP OB1 OB2 VLAOBJ1 VLAOBJ2)
(vl-load-com)
  (setq Ob1 (car (entsel)))
  (setq Ob2 (car (entsel)))
(setq
vlaobj1 (vlax-ename->vla-object Ob1)
vlaobj2 (vlax-ename->vla-object Ob2)
intp (vla-intersectwith vlaobj1 vlaobj2 acExtendNone)
;intp (vla-intersectwith vlaobj1 vlaobj2 acExtendBoth)
; for INTersection Point(s)
intc (safearray-value (variant-value intp))
; for INTersection Coord's [all together]
); end setq
  (print intc); точка список 
  (princ)
)
Puroshev вне форума  
 
Непрочитано 24.03.2016, 15:58
1 | #17
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Krieger Посмотреть сообщение
Там в аргументах функции cond есть такое выражение "(T nil)", какой в этом смысл? "T" ведь не функция, что она делает? Или это просто, чтобы что то было?
Это способ возврата значения из конструкции COND "по умолчанию". Если никакое условие выше в cond не выполняется, то доходит до этого. Раз в начале T - значит, что это условие всегда будет выполнено, если до него дойдет. Там же как - первый аргумент проверяется на nil, если не nil - то возвращается второй аргумент, если nil - переходим к следующему условию. Первый аргумент T не nil, возвращается второй аргумент - nil. Как-то так.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 25.03.2016 в 00:05.
Do$ вне форума  
 
Непрочитано 24.03.2016, 20:57
#18
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Заготовка подсчета глубины траншеи для Тимура С.
Код:
[Выделить все]
  ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*
 ; AutoCAD R 2000-2017
 ; Автор : Пурошев Сергей
 ; Донецкий центр союза архитекторов "Среда"
 ; E-mail  [email protected]
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
(defun C:PSW( / )
; НАЧАЛЬНЫЕ данные ########################################
  (setq dX 1.0); шаг движения вдоль контура
  (setq kH 0.1); коэфю масштаба по Y
  (setq ff (open "D:\\HHH.txt" "w")); файл  высот траншеи с шагом DX
; дальше либо лиспом либо в Excelе ставишь нужные условия по высоте
; и считаешь погонные метры 
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  (vl-load-com)
  (setvar "CMDECHO" 0)
    (setq PL1 (car (entsel "\nУкажи полилинию верх земли:"))) ; первая точка полилинии должна быть слева
  (setq PL2 (car (entsel "\nУкажи полилинию низ трубы:")))
  (setq T1 (car  (POLY_LINE PL1 1)))
  (setq T2 (cadr (POLY_LINE PL1 1)))
  (setq XX (- (car T2) (car T1)))
  (setq T1 (list (car T1) -100000000.0 0.0))
  (setq T2 (list (car T1)  100000000.0 0.0))	 
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$	
	(setq N (fix (/ XX dx)))
	 (repeat N
  	   (setq T1 (polar T1 0.0 dX))
	   (setq T2 (polar T2 0.0 dX))
	   (command "_LINE" T1 T2 "")
	   (setq Ob (entLast))
	   (setq H1 (INT2 PL1 Ob))
	   (setq H2 (INT2 PL2 Ob))
	   (setq HH (* kH (- (cadr H1) (cadr H2))))
	   (print HH)
	   (print HH ff)
	   (entdel Ob)
	   ); End Repeat
(close FF)  
  (princ)
  
  )

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
(defun INT2 (Ob1 Ob2 / INTC INTP  VLAOBJ1 VLAOBJ2)
	(setq
	vlaobj1 (vlax-ename->vla-object Ob1)
	vlaobj2 (vlax-ename->vla-object Ob2)
	intp (vla-intersectwith vlaobj1 vlaobj2 acExtendNone)
	;intp (vla-intersectwith vlaobj1 vlaobj2 acExtendBoth)
	; for INTersection Point(s)
	intc (safearray-value (variant-value intp))
	); end setq
)
	(setvar "DIMDLI" 6)
 ;**************************************************************
 ; Функция возвращает список ((начал.точка) (конеч. точка))
 ; при выборе полилини или отрезка
 ; Параметры:  A1 - имя примитива
 ;            ZZ=0 - Выбор 1 и 2 точки полилинии
 ;            ZZ=1 - Выбор 1 и конечной точки полилинии
 ;**************************************************************
(defun POLY_LINE (A1 ZZ / P1  A2 TIP A200 N_MAX N1 N2 I)
    (setq A2 (entget A1))
    (setq TIP (cdr (assoc 0 A2)))
    (setq A200 NIL)
 ;**************************************************************
    (if (= TIP "LWPOLYLINE")
        (progn
            (setq N_MAX (length A2))
            (setq I 0)
            (repeat N_MAX
                (setq SP (nth I A2))
                (if (= (car SP) 10)
                    (setq A200 (cons (cdr SP) A200))
                )
                (setq I (+ 1 I))
            ) ;Repeat
            (setq A200 (reverse A200))
            (if (= ZZ 0)
                (setq A200 (list (car A200) (cadr A200)))
            )
            (if (= ZZ 1)
                (setq A200 (list (car A200) (last A200)))
            )
        ) ;progn
    ) ;if
 ;****************************************************************
    (setq A200 A200)
)
Puroshev вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Создание Lisp для расчета глубины траншеи

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация Проектировщику на Torrents DEM Разное 262 24.02.2024 17:19
Помогите найти РД по расчетам на прочность 1enin Поиск литературы, чертежей, моделей и прочих материалов 13 08.11.2013 11:50
Ищу ГОСТ Р 52857.1-2007 Сосуды и аппараты. Нормы и методы расчета на прочность. Общие требования ruseng Поиск литературы, чертежей, моделей и прочих материалов 11 14.07.2009 16:25
создание автоматизированногj расчета ayur Программирование 6 20.02.2009 13:08
ГОСТы, СНиПы, ПРАВИЛА и т.д. ki Разное 120 19.09.2007 09:05