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

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

LISP для подсчета суммы длин линий

Ответ
Поиск в этой теме
Непрочитано 12.03.2008, 12:43 #1
LISP для подсчета суммы длин линий
Kostinok
 
Инженер-электрик
 
Калининград
Регистрация: 13.10.2007
Сообщений: 151

Здравствуйте dwg.ru, нашел на форуме замечательный LISP EntLen, который придумал KOS, благодоря которому легко и удобно вести подсчет суммы длин линий, теперь хочеться добавить немного прелестей в него, самому никак не справиться, пока еще не хватает ни опыта, ни знаний, поэтому вынужден обратиться сюда.
Вот его текст:

(vl-load-com)
(defun entLen ( / set:entities int:allEntities int:curveEntities int:l rea:length obj actdoc)
(setq set:entities (ssget))
(setq actdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(if set:entities
(progn
(setq int:allEntities (sslength set:entities) ; количество выбранных примитивов
int:curveEntities 0 ; счетчик линейных примитивов
int:l 0 ; счетчик
rea:length 0.0 ; общая длина линейных примитивов
) ;_ setq
(while (< int:l (sslength set:entities))
(if (not
(vl-catch-all-error-p
(vl-catch-all-apply
'vlax-curve-getStartPoint;_ для чего(Вычисляет начальную точку кривой в МСК)?
(list (vlax-ename->vla-object (ssname set:entities int:l)))
) ;_ vl-catch-all-apply
) ;_ vl-catch-all-error-p
) ;_ not
(setq int:curveEntities (1+ int:curveEntities)
rea:length (+ rea:length
(vlax-curve-getDistAtParam
(vlax-ename->vla-object (ssname set:entities int:l));_Преобразует обычный примитив в VLA объект
(vlax-curve-getEndParam (ssname set:entities int:l))
) ;_ vlax-curve-getDistAtParam
) ;_ +
) ;_ setq
) ;_ if
(setq int:l (1+ int:l))
) ;_ while
(princ (strcat "\n Выбрано примитивов: " (itoa int:allEntities)
", из них линейных: " (itoa int:curveEntities)
"\n Общая длина линейных примитивов: " (rtos rea:length)
)
)
) ;_ progn
(alert "Примитивы не выбраны!")
) ;_ if
(setq obj (vla-get-ModelSpace actdoc))
(vla-addmtext obj (vlax-3d-point (getpoint)) 280 rea:length)
(prin1)
) ;_ defun

Дело в том, что мне необходима ОБЩАЯ длина для подсчета проводки в зданиях, что ни есть сумма длин линий на чертеже и естественно для получения окончательного результата длины приходиться общитывать полученный результат, но уже в Excel. Это становиться возможным, потому что есть определенные правила подсчета, говоря про это хочу подчеркнуть, что я всего лишь в Excelе добавляю определенные коэффициенты, прибавляю или отнимаю вертикальные составляющие, которые ввожу вручную, но в Excelе... Для упрощения приведу пример:

Если на плане данная разводка имеет длину 54189.83мм, то конечным результатом будет 90м, потому как разводка выполняеться на ВЫСОТЕ 2,5м, СПУСКИ к 10-ти розеткам, каждый по 2,5м плюс прибавка на неточность и специфику монтажа составляет 10% от общей длины, т.е. конечный расчет выходит как

(54189.83/1000(перевел в метры)+2,5м(поднялся вверх от щита)+10роз.*2,5м(спуски на розетки))*1,1(10% от общей длины)=90м.

Задача в самом AutoCADе вводить:
1. ВЫСОТУ проводки
2. Колличество СПУСКОВ, и т.д.

3. В конце выполнения программы необходимо вывести результат: многострочный текст, с точкой привязки Bottom centre, т.е. искомые 90м. И текстовый "отчет" в виде:
ВЫСОТА проводки: 2,5м
Колличество СПУСКОВ: 10
т.е. те данные, которые надо ввести уже самостоятельно, по ходу выполнения программы.

Это естественно не полный расчет, но надеюсь, что смогу разобраться с принципом работы "модернизированного EntLen", и дальше смогу самостоятельно доработать программу под себя.

Другими словами необходимо добавить функции, которые дают возможность вводить данные в интерактивном режиме, а также выводить результат выполнения программы на чертеж, и, ОТДЕЛЬНО, отчет о вводимых вручную данных.

Прошу помочь или подсказать, как это можно выполнить.
Заранее благодарен.
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Просмотров: 22387
 
Непрочитано 12.03.2008, 14:05
#2
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от Kostinok Посмотреть сообщение
... поэтому вынужден обратиться сюда...
А вот и не сюда! Для этого есть раздел программирование. В крайнем случае можно было продолжить тему где ты взял код.
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 12.03.2008, 15:21
1 | #3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Отсюда код взят
Нужен LISP для суммы длин отрезков линни
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 13.03.2008, 06:17
#4
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


VVA, да) код от KOS, за что я ему очень благодарен. Только вот теперь надо его немного изменить, вернее добавить под себя))) Поэтому обратился за помощью... Вы не могли бы посоветовать, как это можно осуществить.
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/

Последний раз редактировалось Kostinok, 13.03.2008 в 09:24.
Kostinok вне форума  
 
Непрочитано 13.03.2008, 10:07
#5
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Так ведь подъем от щитка не всегда равен опускам к розеткам, нужно еще запросы в программу добавлять.

А зачем собственно программу переписывать? Если чертить трассы в трехмерке, то сразу можно посчитать полную длину проводки. При виде сверху ведь без разницы, на какой высоте расположены линии.
Вот разве что 10% автоматом не накинет. Насколько я знаю, обычно берется ~10% + округление до целых метров (часто с 0 или 5 в конце). Вот как такое программе объяснить: сколько мне захотелось - столько и добавлю?
Если в трехмерке чертить, то можно не вводить дополнительные данные. А вывод результатов организовать так:
- общая длина ... м
- кол-во горизонтальных участков ..., общ длина ... м, из них
- на высоте 2.000 - столько-то, общ длина ... м, итд
- кол-во вертикальных участков ..., общ длина ... м, из них
- длиной 1000 м - столько-то, итд

Сделать-то можно, если есть у кого желание поковыряться.
Олег К. на форуме  
 
Автор темы   Непрочитано 13.03.2008, 10:18
#6
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Олег К.,
Цитата:
Если чертить трассы в трехмерке
В этом нет необходимости
Округлять можно вверх до ближайшего целого)
Особо изменять Лисп ведь не надо... надо добавить функции интерактивного ввода и вместо rea:length, добавить стандартную формулу. Формулу можно подкорректировать под себя уже после самому, щас главное принцип понять!

Подскажите как сделать хотя бы 1 изменение, имееться ввиду, что общая длина плюс любое вводимое вручную число, и что бы результат выводился на чертеж в виде MTEXT с точкой привязки Bottom centre
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 13.03.2008, 13:11
#7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Код:
[Выделить все]
 
(vl-load-com)
(defun entlen1 (/ set:entities int:allentities int:curveentities int:l rea:length obj actdoc rea:user_number rea:user_kf
                rea:all)
  (initget 1)
  (setq rea:user_number (getreal "\nВведите поправочное число: "))
  (initget 1)
  (setq rea:user_kf (getreal "\nВведите поправочный коэффициент: "))
  (setq set:entities (ssget))
  (setq actdoc (vla-get-activedocument (vlax-get-acad-object)))
  (if set:entities
    (progn
      (setq int:allentities
             (sslength set:entities) ; количество выбранных примитивов
            int:curveentities
             0 ; счетчик линейных примитивов
            int:l 0 ; счетчик
            rea:length
             0.0 ; общая длина линейных примитивов
            ) ;_ setq
      (while (< int:l (sslength set:entities))
        (if (not
              (vl-catch-all-error-p
                (vl-catch-all-apply
                  'vlax-curve-getstartpoint ;_ для чего(Вычисляет начальную точку кривой в МСК)?
                  (list (vlax-ename->vla-object (ssname set:entities int:l)))
                  ) ;_ vl-catch-all-apply
                ) ;_ vl-catch-all-error-p
              ) ;_ not
          (setq int:curveentities (1+ int:curveentities)
                rea:length        (+ rea:length
                                     (vlax-curve-getdistatparam
                                       (vlax-ename->vla-object (ssname set:entities int:l)) ;_Преобразует обычный примитив в VLA объект
                                       (vlax-curve-getendparam (ssname set:entities int:l))
                                       ) ;_ vlax-curve-getDistAtParam
                                     ) ;_ +
                ) ;_ setq
          ) ;_ if
        (setq int:l (1+ int:l))
        ) ;_ while
;;;Полная длинна с учетом поправки и поправочного коэффициента
      (setq rea:all (* rea:user_kf (+ rea:length rea:user_number)))
      (princ (strcat "\n Выбрано примитивов: "
                     (itoa int:allentities)
                     ", из них линейных: "
                     (itoa int:curveentities)
                     "\n Общая длина линейных примитивов: "
                     (rtos rea:length)
                     "\n Поправочка число: "
                     (rtos rea:user_number)
                     "   Поправочка коэффициент: "
                     (rtos rea:user_number)
                     "\n Общая длина линейных примитивов+поправка: "
                     (rtos rea:all)
                     "\n"
                     ) ;_ end of strcat
             ) ;_ end of princ
      ) ;_ progn
    (alert "Примитивы не выбраны!")
    ) ;_ if
  (setvar "CMDECHO" 0)
  (command "_-MTEXT" "_non" "0,0" "_J" "_BC" "_W" 280 (rtos rea:all 2) "")
  (command "_.copybase" "_non" "0,0" (entlast) "")
  (command "_.erase" (entlast) "")
  (setvar "CMDECHO" 1)
  (command "_.pasteclip" pause)
;;;(setq obj (vla-get-ModelSpace actdoc))  
;;;(vla-addmtext obj (vlax-3d-point (getpoint)) 280 rea:length)
  (prin1)
  ) ;_ defun
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось Кулик Алексей aka kpblc, 21.01.2014 в 09:20.
VVA вне форума  
 
Непрочитано 13.03.2008, 13:41
#8
SergGL

инженер
 
Регистрация: 13.08.2006
г. Пенза
Сообщений: 113


2VVA
Почему-то код работает только после исправления
<< (defun С:entLen1 >>
__________________
MEMENTO QUOD ES HOMO
SergGL вне форума  
 
Непрочитано 13.03.2008, 13:47
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Ты из функции сделал команду. Просто в оригинале была функция, так функцией и оставил. Чтобы ее вызвать нужно, нужно набрать в командной строке (entlen1)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 25.11.2012 в 11:17.
VVA вне форума  
 
Автор темы   Непрочитано 13.03.2008, 14:22
#10
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


VVA, огромное спасибо теперь попробую разобраться что там к чему, с принципом работы. Еще раз большое спасибо
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 13.03.2008, 15:52
#11
SergGL

инженер
 
Регистрация: 13.08.2006
г. Пенза
Сообщений: 113


2VVA
Понял. Работает.
__________________
MEMENTO QUOD ES HOMO
SergGL вне форума  
 
Непрочитано 13.03.2008, 15:55
#12
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Весь принцип работы здесь:
Код:
[Выделить все]
 
;;;Полная длинна с учетом поправки и поправочного коэффициента
(setq rea:all (* rea:user_kf (+ rea:length rea:user_number)))
rea:user_kf - введенный поправочный коэффициент
rea:length - посчитанная длина
rea:user_number - введенное поправочное число
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.03.2008, 13:47
#13
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


VVA, а можно еще что бы текст выводился уже на определенном слое, под названием text?
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 06.12.2010, 14:38
#14
skkkk


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


Подскажите, пожалуйста, можно ли каким-то образом получить в лиспе длину указанной полилинии, но не всю, а от начала полилинии до указанной точки? Т.е. на запрос getpoint указываю точку на полилинии, а в коде лиспа возвращается длина от начала до этой точки. Тут еще возникает нюанс с направлением отрисовки этой полилинии, но с реверсом я знаком - это не проблема
skkkk вне форума  
 
Непрочитано 06.12.2010, 14:49
#15
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> skkkk, функция vlax-curve-getDistAtPoint , оно? Или нужно на AutoLISPe, а не Visual ?
Олег К. на форуме  
 
Непрочитано 06.12.2010, 15:16
#16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


lisp: Длина по полилинии до точки
Расстояние от начала полилинии до опеделенной точки
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.12.2010, 17:33
#17
skkkk


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


>> Олег К., если в Auto я еще хоть как-то..., то в Visual не знаю совсем... Вроде, эта функция и нужна, спасибо, попробую разобраться.
>> VVA, спасибо, догадывался, что есть тема поближе, виноват, пропустил пункт "Поиск", я исправлюсь, пойду в ту ветку разбираться глубже
skkkk вне форума  
 
Непрочитано 26.04.2013, 14:04
#18
Денис52


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


А как изменить масштаб единиц в данном коде, что он переводил сразу в метры или километры к примеру?
Чтобы не задавать значение в "введенном поправочном коэффициенте".
Денис52 вне форума  
 
Непрочитано 26.04.2013, 14:56
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Вместо
Код:
[Выделить все]
(setq rea:user_kf (getreal "\nВведите поправочный коэффициент: "))
Записать
Код:
[Выделить все]
(setq rea:user_kf 0.001)
где вместо 0.001 записать нужный коэффициент
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP для подсчета суммы длин линий

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен LISP для суммы длин отрезков линни ilka_t LISP 219 10.09.2019 10:22
Нужен LISP для разрыва линий в точках пересечений ilka_t LISP 18 15.03.2013 16:35
Электромагнитная пушка T-Yoke Машиностроение 112 06.08.2008 18:48
Lisp для текста Vova LISP 11 13.05.2004 17:39
Нужен LISP для заливки отверстий ilka_t AutoCAD 20 24.03.2004 16:06