NANOCAD ШОУ
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

Нужен LISP для суммы длин отрезков линни

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 26.02.2004, 10:13
Нужен LISP для суммы длин отрезков линни
ilka_t
 
Москва
Регистрация: 20.01.2004
Сообщений: 152

ilka_t вне форума Вставить имя

Подскажити где можно скачать или поделитись если у кого есть такое.

Полилиния не подходит т.к. эти отрезки разбросаны по всему чертежу, а надобы выбрав несколько линий узнать их общую длинну.
Просмотров: 99696
 
Непрочитано 25.05.2017, 12:48
#181
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,072


Цитата:
Сообщение от VVA Посмотреть сообщение
Значит считается, что обход линии идет по часовой и нет необходимости реверсировать линию
В том то и дело, что я пытался эти команды применять к горизонтальной полилинии, которую реверсировал вручную, а затем применял эти команды. Первая ничего не делает, как бы я линию не повернул. А вторая - реверсирует, тоже, как бы я ее не повернул. Вот тебе, бабушка, и Юрьев день
Где я и что делаю не так?
В контексте последнего кода подумываю над тем, чтобы просто проверять, на каждой новой полилинии в цикле, начало ли полилинии "нащупалось", и если нет, то просто реверсировать ее.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.05.2017, 12:09
#182
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 87


По-моему, что-то вы перемудрили. Исходная задача какая: есть единая полилиния рельефа, и надо записать в графе профиля расстояния по ней с определённым шагом по пикетажу. Это можно сделать в одном цикле, и не надо ничего рвать и выбирать каждый раз новую полилинию. Направление исходной, конечно, надо проверить.
В общем, какой-то такой функционал получается:
Код:
[Выделить все]
 (princ "\nУкажите линию рельефа")
(setq graf    (vlax-ename->vla-object
                (ssname (ssget "_:S" '((0 . "LWPOLYLINE"))) 0))
      step    (getint "Введите шаг:  ")
      ins_pt  (cadr (getpoint "\nУкажите Y-координату начала строк: "))
      m_sp    (vla-get-ModelSpace
                (vla-get-ActiveDocument (vlax-get-acad-object)))
      t_const (append
                '((0 . "TEXT")
                  (100 . "AcDbEntity")
                  (67 . 0)
                  (410 . "Model")
                  (100 . "AcDbText")
                  (50 . 1.5708))
                (list (cons 40 (getreal "\nВведите высоту текста:  ")))
                '((41 . 1.0)
                  (51 . 0.0)
                  (7 . "Standard")
                  (71 . 0)
                  (72 . 0))) ;DXF-коды, общие для всех текстовых меток
      begin   (vlax-curve-getStartPoint graf)
      )
(entmakex (append t_const
                  (list (cons 1 "0.00")
                        (list 10 (car begin) ins_pt 0.0))))
(setq begin (list (+ step (car begin)) (cadr begin)))
(while (setq per
              (vlax-variant-value
                (vla-IntersectWith
                  graf
                  (vla-AddLightWeightPolyline
                    m_sp
                    (vlax-safearray-fill
                      (vlax-make-safearray vlax-vbDouble '(0 . 3))
                      (list (car begin)
                            (- (cadr begin) 1000)
                            (car begin)
                            (+ (cadr begin) 1000))))
                  acExtendOtherEntity)))
  (entdel (entlast))
  (entmakex
    (append t_const
            (list (cons 1
                        (rtos (vlax-curve-getDistAtPoint
                                graf
                                (vlax-curve-getClosestPointTo
                                  graf
                                  (vlax-safearray->list per)))
                              2
                              2))
                  (list 10 (car begin) ins_pt 0.0))))
  (setq begin (list (+ step (car begin)) (cadr begin)))
  ) ;end of while
P_S вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.05.2017, 15:44
#183
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,072


Цитата:
Сообщение от P_S Посмотреть сообщение
По-моему, что-то вы перемудрили
Вообще-то - да. Хотя, я бы сказал, "недомудрил". Вообще ничего не продумывал особо. Поэтому и сразу назвал команду "TEST". Полилинию, конечно, можно не разбивать. Просто в файле с исходной задачей она была уже разорванна в клочья. Я подумал, что это результат работы какой-то программы, поэтому не стал вдаваться в подробности и сделал применительно к файлу-задаче. К тому моменту, как я прочитал (что надо еще и разрывать), добрая часть кода уже родилась Поэтому я переделывать уже не стал - время свободное вышло, просто дал ссылку на "разбивалку".
Я подумал вот что. Надо дать Рyslan'у немного поработать "в бою", может, он еще что выявит. И в случае необходимости, чтобы код стал действительно рабочим, надо будет чуток доработать его с учетом:
1. Не бить линию на куски.
2. Добавить проверку направления обхода вершин.
3. Добавить обработку плавающей точки. Вот тут момент спорный. Если сделать, чтобы результат обработки линий по частям (за два-три захода со вводом вместо нуля предыдущего значения) совпадал с результатом обработки цельной полилинии, то в итоге конечная цифра будет до нескольких десятых метра расходится с длиной линии в свойствах. Даже и не знаю, как тут правильно поступить. Может, разумнее будет вводить стартовую длину до трех знаков после запятой? Или запрашивать не число, а линию и брать длину с нее?
Вопрос еще в том, насколько эта программа перейдет в разряд необходимых, может, это просто разовая (двух-) задача?

----- добавлено через 58 сек. -----
P.S.: P_S, кстати, у Вас теряется последний текст.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.05.2017, 19:23
#184
Рyslan


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


Всем привет! Спасибо за помощь! Я полилинию разбивал, чтобы через свойства посчитать длину. Но если можно будет не разбивая посчитать, то это вообще шикарно! skkkk я результаты подсчета после твоей программы не проверял )))) надеюсь там все ок ))))
Рyslan вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.05.2017, 11:06
#185
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 87


Да, выход из цикла у меня получился с ошибкой (safearray с нулевым значением не есть nil), так что корректно получается что-то такое:
Код:
[Выделить все]
 (defun C:TEST  (/ graf step ins_pt m_sp t_const begin per)
  (princ "\nУкажите линию рельефа")
  (setq graf    (vlax-ename->vla-object
                  (ssname (ssget "_:S" '((0 . "LWPOLYLINE"))) 0))
        step    (getint "Введите шаг:  ")
        ins_pt  (cadr (getpoint "\nУкажите Y-координату начала строк: "))
        m_sp    (vla-get-ModelSpace
                  (vla-get-ActiveDocument (vlax-get-acad-object)))
        t_const (append
                  '((0 . "TEXT")
                    (100 . "AcDbEntity")
                    (67 . 0)
                    (410 . "Model")
                    (100 . "AcDbText")
                    (50 . 1.5708))
                  (list (cons 40 (getreal "\nВведите высоту текста:  ")))
                  '((41 . 1.0)
                    (51 . 0.0)
                    (7 . "Standard")
                    (71 . 0)
                    (72 . 0)));DXF-коды, общие для всех текстовых меток
        begin   (vlax-curve-getStartPoint graf)
        )
  (entmakex (append t_const
                    (list (cons 1 "0.00")
                          (list 10 (car begin) ins_pt 0.0))))
  (setq begin (list (+ step (car begin)) (cadr begin)))
  (repeat (fix (/ (- (car (vlax-curve-getEndPoint graf))
                     (car (vlax-curve-getStartPoint graf)))
                  step))
    (setq per
           (vlax-safearray->list
             (vlax-variant-value
               (vla-IntersectWith
                 graf
                 (vla-AddLightWeightPolyline
                   m_sp
                   (vlax-safearray-fill
                     (vlax-make-safearray vlax-vbDouble '(0 . 3))
                     (list (car begin)
                           (- (cadr begin) 1000)
                           (car begin)
                           (+ (cadr begin) 1000))))
                 acExtendOtherEntity))))
    (entdel (entlast))
    (entmakex
      (append t_const
              (list (cons 1
                          (rtos (vlax-curve-getDistAtPoint
                                  graf
                                  (vlax-curve-getClosestPointTo
                                    graf
                                    per))
                                2
                                2))
                    (list 10 (car begin) ins_pt 0.0))))
    (setq begin (list (+ step (car begin)) (cadr begin)))
    ) ;end of repeat

  (entmakex
    (append
      t_const
      (list (cons 1 (rtos (vla-get-Length graf) 2 2))
            (list 10 (car (vlax-curve-getEndPoint graf)) ins_pt 0.0))))
  )
P_S вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.05.2017, 16:21
#186
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,072


Цитата:
Сообщение от Рyslan Посмотреть сообщение
результаты подсчета после твоей программы не проверял
В том файле, на котором я делал, было все ОК. Это я имел в виду, что вдруг на других рабочих файлах какая из полилиний как-то "обратилась" к лесу задом. Хотя, если начальная была слева направо, то и результирующие куски будут такими же.
Вообще, конечно, я считаю, надежнее будет использовать алгоритм от P_S. Даже если не уследил за направлением полилинии, косяк незамеченным точно не останется - ноль справа будет. Единственное, что я еще заметил, что тексты там расставляются не строго по центру каждый над своей линией, а со смещением влево на пол высоты текста. Выравнивание у текстов - слева вверх. Если, это, конечно, важно.
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.06.2017, 06:40
#187
Рyslan


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


P_S, skkkk Привет! Спасибо, последнюю программу посмотрел, все работает. Вопрос, а если полилиния (рельеф) разбит не на равные участки, шаг текста не получится задать одной цифрой. Можно сделать чтобы текст выставлялся над точками полилинии (без ввода шага)?
Рyslan вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.06.2017, 07:11
#188
Кулик Алексей aka kpblc
Moderator

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


А, может, все же в отдельную тему?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.06.2017, 07:17
#189
Рyslan


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


Как скажешь А что сделать то надо?
Рyslan вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.06.2017, 08:17
#190
Кулик Алексей aka kpblc
Moderator

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


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

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.06.2017, 08:27
#191
Рyslan


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А так - сумма длин кривых и расстановка текста разные задачи
Вообще-то этот текст и есть сумма длин кривых и программа та же. Чего плодить тему. Я думал ты хочешь эти программы вынести в другую тему. Типа "Подсчет расстояний в профиле по рельефу земли" для оформления подвала чертежа продольного профиля трубопровода
Рyslan вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.09.2017, 10:26
#192
Alex_Shaton


 
Регистрация: 09.09.2017
Гомель
Сообщений: 3


Уважаемые гуру! Можно ли отредактировать код из поста 62, чтобы в чертеж вставлялась бы не округленное значение длины полилинии, а сумма значений длин сегментов, округленных до первого знака после запятой?
Alex_Shaton вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.09.2017, 14:16
1 | 3 #193
Кулик Алексей aka kpblc
Moderator

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


Можно. Редактируй.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.09.2017, 01:11
#194
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,072


Чем отличается сумма значений длин сегментов полилинии от ее общей длины?
skkkk на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.09.2017, 07:27
#195
trir


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


Цитата:
Чем отличается сумма значений длин сегментов полилинии от ее общей длины?
округлением
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен LISP для суммы длин отрезков линни

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


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