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

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

Создание средней (осевой) линии или биссектрисы.

Ответ
Поиск в этой теме
Непрочитано 02.05.2012, 13:49
Создание средней (осевой) линии или биссектрисы.
Astartes
 
Котло- и реакторостроение
 
Барнаул
Регистрация: 25.02.2010
Сообщений: 825

Приветствую.
Я знаю что есть два лиспа для решения подобной задачи. Это bi_line Александра Ривилиса, и Middle PolyLine (MPL) от VVA.
Оба лиспа работаю хорошо. Спасибо авторам.
Единственная "проблема", для того чтобы построить линию между двумя другими нужно первую и вторую линию выделять по отдельности.
Вопрос можно подработать лисп так, чтобы выделить две линии рамкой, затем Ентер, и средняя линия (биссектриса) готова? Или это невозможно?

Последний раз редактировалось Astartes, 03.05.2012 в 04:54.
Просмотров: 16583
 
Автор темы   Непрочитано 14.05.2012, 12:21
#21
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


ciril, Все работает. Спасибо. Ну будете у нас на колыме... )) С меня стакан чаю. ))

ЗЫ: Может еще придумаю какую-нибудь задачу. ))
Astartes вне форума  
 
Непрочитано 14.05.2012, 13:32
#22
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Да, не за что
ciril вне форума  
 
Автор темы   Непрочитано 15.05.2012, 06:12
#23
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


ciril, У меня еще возник вопрос. ))
А спланы таким же образом как и дуги можно обработать, для получения среднего сплайна?
Вложения
Тип файла: dwg
DWG 2007
Чертеж7.dwg (93.5 Кб, 1918 просмотров)
Astartes вне форума  
 
Непрочитано 15.05.2012, 09:19
#24
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811



Пробуй
Код:
[Выделить все]
(defun C:demo(/ osm p1 p2 sp1)
(setq osm (getvar "osmode" ))
(setvar "osmode" 512)
(setq p1 (getpoint "\nFirst curve: "))
(setvar "osmode" 128)
(setq p2 (getpoint p1 "\nSecond curve: "))
(setq sp1 (ssget "_F"
		 (list
		   (trans (mapcar '+ p1 (list 1 1 0))1 0)
		   (trans (mapcar '+ p1 (list -1 -1 0))1 0))
		 '((0 . "*line,arc,circle")))
      )
(command "_.offset" "T" sp1
	 (trans (mapcar '(lambda (a b )(/ (+ a b) 2.))p1 p2)1 0) "")
  (setvar "osmode" osm)
  (princ)
  )
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 15.05.2012, 10:08
#25
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


Олег (jr.), Спасибо. Только вот я наверное непониаю чегото. Ваш лисп работает точно также как обычный оффсет. Указываю величину смещения, и сторону для смещения. Смысл?
Если со сплайнами нельзя работать по такому же принципу как с линиями и дугами как в модернизированном bi_line.lsp и соответственно эту работу нельзя интегрировать туда же, то тогда не актуально.

На всякий случай. Лисп работает с ошибкой.

Команда: demo
First curve:
Second curve: _.offset
Текущие настройки: Удалить исходные=Нет Слой=Источник OFFSETGAPTYPE=0
Укажите расстояние смещения или [Через/Удалить/Слой] <0.0000>: T
Требуется численное значение расстояния, две точки или ключевое слово.
; ошибка: Функция прервана.

(Мой комментарий: После этого работает как обычный оффсет. Зачем нужно было указывать первую кривую и вторую кривую, непонятно)

Укажите расстояние смещения или [Через/Удалить/Слой] <0.0000>: 14
Выберите объект для смещения или [Выход/Отменить] <Выход>:
Укажите точку, определяющую сторону смещения, или [Выход/Несколько/Отменить]
<Выход>:
Выберите объект для смещения или [Выход/Отменить] <Выход>:

Плюс ко всему, сбиваются настроки привязок. Их потом заново приходится ставить.

Последний раз редактировалось Astartes, 15.05.2012 в 10:18.
Astartes вне форума  
 
Непрочитано 15.05.2012, 12:20
#26
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Astartes, скажите, ваши сплайны попарно всегда имеют одинаковое количество узлов?
ciril вне форума  
 
Автор темы   Непрочитано 15.05.2012, 12:31
#27
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


ciril, Как я понял не всегда. Эти сплайны получаются при снятии проекции флатшотом, когда гиб находится не ортогонально плоскости. Выкладываю еще пример.
Вложения
Тип файла: dwg
DWG 2007
Сплайн.dwg (101.9 Кб, 1910 просмотров)
Astartes вне форума  
 
Непрочитано 15.05.2012, 12:47
#28
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


блин! я решал похожую для полилиний - построение оси дороги по обочинам, которые полилинии, она не всегда корректно работает: не всегда правильно выбирает узлы, между которыми строится средняя точка. ошибка получается графически незначительной, поэтому тогда подошло я переделаю ее под сплайны, а там будет ясно, подойдет или нет.
ciril вне форума  
 
Автор темы   Непрочитано 15.05.2012, 12:54
#29
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


ciril, Выше я выкладывал лисп от VVA, там у него тоже работа с полилиниями. Может пригодится. Если сплайн превратить в полилинию, то лисп работает корректно. Только вот полилиния с ее узлами не подходить для осевой линии. Линия отображается как сплошная. А вот узлы сплайна этому не помеха, линия отображается осевой.
Astartes вне форума  
 
Непрочитано 15.05.2012, 13:10
#30
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


если включить генерацию типа линии, то узлы полилинии тоже не будут помехой
Код:
[Выделить все]
 (setvar 'plinegen 1)

Последний раз редактировалось ciril, 15.05.2012 в 13:25.
ciril вне форума  
 
Автор темы   Непрочитано 15.05.2012, 13:39
#31
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


ciril, Не понятно. Попробовал вне лиспа, просто plinegen =1, ничего не поменялось. Линия осталось сплошной. Да и конвертить сплайн в полилинию, лишнее действие, если конечно же со сплайном получится нормально.

ЗЫ: Тоже вот с полилиниями странность. Если конвертить спалайн в полилинию с помощью pl-join от VVA, то переменная не помогает. Линия остается сплошной. Если конвертить с помощью Total Purge, то тогда осевая линия отображается нормально. Интересно, раньше на замечал такой разницы.

Последний раз редактировалось Astartes, 15.05.2012 в 13:45.
Astartes вне форума  
 
Непрочитано 15.05.2012, 14:01
#32
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


системная переменная влияет на генерацию типа линий для вновь создаваемых полилиний. для уже созданных: выбери полилинию, на панели свойств (вызывается ctrl+1) найди одноименную строку (она в самом низу панели в разделе "разное") и включи ее. может придется регенерировать чертеж, не знаю тебя устраивает, как строит среднюю MPL, просто, она не всегда средняя?
приложил файл, какая линия правильней: синяя или красная?
Вложения
Тип файла: dwg
DWG 2010
средняя.dwg (369.0 Кб, 1920 просмотров)

Последний раз редактировалось ciril, 15.05.2012 в 14:19.
ciril вне форума  
 
Автор темы   Непрочитано 16.05.2012, 05:25
#33
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


Ага, с регенерацией разобрался. Спасибо, не знал о такой фишке полилиний.
Касательно средней линии. Если была возможность среднюю линию ставил MPL. Если не конвертил сплайны в полилинию то ставил оффсетом. А вот только после вашей наколки, увидел что линии ставятся немного по разному. На самом деле мне без разницы. Большая точность не нужна, т.к. в основном это для монтажного чертежа. А там масштабы соответствующие. На рабочих чертежах все выполнено линиями и дугами, так что для рабочки вполне достаточно модернизированного вами лиспа.
Синия линия я так понял получилась с помощью MPL. А красная с помощью чего? Потому что обычный оффсет дает вообще третий результат. ))
Astartes вне форума  
 
Непрочитано 16.05.2012, 11:12
#34
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


красная с помощью того, что я написал. немного позже выложу для сплайнов
ciril вне форума  
 
Непрочитано 17.05.2012, 14:27
#35
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Ну вот как-то так. Криво работает на сплайнах, которые разнонаправлены, не могу разобраться с весом узла, как он его пересчитывать.
Код:
[Выделить все]
 (defun C:BI_LINE  (/ x00 x01 x01 x02 x03 x04 x05 x06 x07 x08 x09 x0a x0b x0c x0d x0e _bm _cm)
  (setq _cm (getvar "CMDECHO")
        _bm (getvar "BLIPMODE"))
  (setvar "CMDECHO" 1)
  (setvar "BLIPMODE" 0)
  (while (progn (princ "\nВыберите отрезки или дуги, или сплайны...")
                (setq x00 (ssget '((-4 . "<or") (0 . "line") (0 . "arc") (0 . "spline") (-4 . "or>")))))
    (redraw (setq x01 (ssname x00 0)) 3)
    (redraw (setq x02 (ssname x00 (1- (sslength x00)))) 3)
    (setq x00 nil
          x05 (cdr (assoc 0 (setq x03 (entget x01))))
          x06 (cdr (assoc 0 (setq x04 (entget x02)))))
    (cond ((and (eq "LINE" x05) (eq "LINE" x06))
           (if (> (+ (distance (setq x05 (cdr (assoc 10 x03))) (setq x06 (cdr (assoc 10 x04))))
                     (distance (setq x03 (cdr (assoc 11 x03))) (setq x04 (cdr (assoc 11 x04)))))
                  (+ (distance x05 x04) (distance x03 x06)))
             (setq x00 x06
                   x06 x04
                   x04 x00))
           (cond ;;оотерзки пересекаются
                 ((setq x07 (inters x05 x03 x06 x04 t))
                  (setq x08 (max (distance x07 x05) (distance x07 x06))
                        x09 (max (distance x07 x03) (distance x07 x04))
                        x05 (polar x07 (angle x07 x05) x08)
                        x03 (polar x07 (angle x07 x03) x09)
                        x06 (polar x07 (angle x07 x06) x08)
                        x04 (polar x07 (angle x07 x04) x09)))
                 ;; пересекаются прямые, на которых лежат отрезки
                 ((setq x07 (inters x05 x03 x06 x04 nil))
                  (if (> (distance x07 x05) (distance x07 x03))
                    (setq x00 x05
                          x05 x03
                          x03 x00
                          x00 x06
                          x06 x04
                          x04 x00))
                  (setq x08 (min (distance x07 x05) (distance x07 x06))
                        x09 (max (distance x07 x03) (distance x07 x04))
                        x05 (polar x07 (angle x07 x05) x08)
                        x03 (polar x07 (angle x07 x03) x09)
                        x06 (polar x07 (angle x07 x06) x08)
                        x04 (polar x07 (angle x07 x04) x09))))
           (or (entmake (list '(0 . "LINE")
                              '(6 . "ACAD_ISO04W100")
                              '(370 . 20)
                              (cons 10 (trans (mapcar '* '(0.5 0.5 0.5) (mapcar '+ x05 x06)) 0 1))
                              (cons 11 (trans (mapcar '* '(0.5 0.5 0.5) (mapcar '+ x03 x04)) 0 1))))
               (princ "\nОтрезок не создан!")))
          ((and (eq "ARC" x05) (eq "ARC" x06))
           (or (entmake
                 (list '(0 . "ARC")
                       '(6 . "ACAD_ISO04W100")
                       '(370 . 20)
                       (cons 10
                             (trans (mapcar '* '(0.5 0.5 0.5) (mapcar '+ (cdr (assoc 10 x03)) (cdr (assoc 10 x04)))) 0 1))
                       (cons 40 (/ (+ (cdr (assoc 40 x03)) (cdr (assoc 40 x04))) 2))
                       (cons 50 (/ (+ (cdr (assoc 50 x03)) (cdr (assoc 50 x04))) 2))
                       (cons 51 (/ (+ (cdr (assoc 51 x03)) (cdr (assoc 51 x04))) 2))))
               (princ "\nДуга не создана!")))
          ((and (eq "SPLINE" x05) (eq "SPLINE" x06))
           (setq x00 (list (quote (setq x0b (append x0b (list (cons 40 (/ (+ (cdar (setq x03 (cdr x03))) (cdar (setq x04 (cdr x04)))) 2))))
                                        x0c (append x0c (list (cons 10 (polar x09 (angle x09 x0a) (/ x0e 2)))))
                                        x07 (cdr x07)
                                        x08 (cdr x08)
                                        x05 x09
                                        x06 x0a))
                           (quote (setq x0b (append x0b (list (cons 40 (/ (+ (cdar (setq x03 (cdr x03))) (cdar x04)) 2))))
                                        x0c (append x0c (list (cons 10 (polar x09 (angle x09 x06) (/ x0e 2)))))
                                        x07 (cdr x07)
                                        x05 x09))
                           (quote (setq x0b (append x0b (list (cons 40 (/ (+ (cdar x03) (cdar (setq x04 (cdr x04)))) 2))))
                                        x0c (append x0c (list (cons 10 (polar x05 (angle x05 x0a) (/ x0e 2)))))
                                        x08 (cdr x08)
                                        x06 x0a)))
                 x07 (member (setq x05 (assoc 10 x03)) x03)
                 x08 (member (setq x06 (assoc 10 x04)) x04)
                 x0b (list)
                 x03 (member (assoc 40 (setq x03 (reverse (member (assoc 40 (setq x03 (reverse x03))) x03)))) x03)
                 x04 (member (assoc 40 (setq x04 (reverse (member (assoc 40 (setq x04 (reverse x04))) x04)))) x04)
                 x05 (cdr x05)
                 x06 (cdr x06))
           (repeat 4
             (setq x0b (append x0b (list (cons 40 (/ (+ (cdar x03) (cdar x04)) 2))))
                   x03 (cdr x03)
                   x04 (cdr x04)))
           (and (> (distance x05 x06) (distance x05 (cdr (last x08))))
                (> (distance x05 x06) (distance (cdr (last x07)) x06))
                (setq x08 (reverse (cons (cons 10 x06) x08))
                      x06 (cdar x08)
                      x08 (cdr x08))) ;x04 (reverse x04)
           (setq x0b (append x0b (list (cons 40 (/ (+ (cdar x03) (cdar x04)) 2)))))
           (setq x0c (list (cons 10 (polar x05 (angle x05 x06) (/ (distance x05 x06) 2)))))
           (while (and (setq x09 (cdadr x07)) (setq x0a (cdadr x08)))
             (eval
               (nth (1-
                      (length
                        (member (setq x0e (apply 'min (setq x0d (list (distance x05 x0a) (distance x06 x09) (distance x09 x0a)))))
                                x0d)))
                    x00)))
           (setq x00 (cdar x03))
           (or x0a
               (setq x08 x07
                     x00 (cdar x04)
                     x04 x03
                     x0a x09
                     x05 x06))
           (repeat (length x08)
             (setq x0b (append x0b (list (cons 40 (/ (+ x00 (cdar x04)) 2))))
                   x0c (append x0c (list (cons 10 (polar x05 (angle x05 x0a) (/ (distance x05 x0a) 2)))))
                   x04 (cdr x04)
                   x08 (cdr x08)
                   x0a (cdar x08)))
           (or (entmake (append (quote ((0 . "SPLINE") (100 . "AcDbEntity")
                                                       (100 . "AcDbSpline") 
                                                       (6 . "ACAD_ISO04W100")
                                                       (370 . 20)
                                                       (70 . 8)
                                                       (71 . 3)))
                                (list (cons 72 (length x0b)) (cons 73 (length x0c)))
                                (quote ((74 . 0) (42 . 1.0e-10) (43 . 1.0e-10)))
                                x0b
                                x0c))
               (princ "\nСплайн не созданн!")))
          (t (princ "\nВыбраны примитивы разных типов!")))
    (redraw x01 4)
    (redraw x02 4))
  (setvar "BLIPMODE" _bm)
  (setvar "CMDECHO" _cm)
  (princ))
Со сплайнами на некоторых участках лишние перегибы.

Последний раз редактировалось ciril, 18.05.2012 в 10:28.
ciril вне форума  
 
Автор темы   Непрочитано 18.05.2012, 07:58
#36
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


Спасибо работает. Хоть иногда и странно (см. приложение). Слева средний сплайн построисля криво если выделять рамкой. А справа сплайн нормально построился если выделять по отдельности. Объекты то одни и теже.
Ну это так чисто к сведению.
Вложения
Тип файла: dwg
DWG 2007
Сплайн.dwg (91.9 Кб, 1906 просмотров)
Astartes вне форума  
 
Непрочитано 18.05.2012, 10:32
#37
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


ошибался на условии на обращение сплайна поправил в посте 35, пока так, но надо подумать: могут быть положения, когда он будет обращать без необходимости
ciril вне форума  
 
Автор темы   Непрочитано 18.05.2012, 10:44
#38
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 825


Обратно благодарю. )) Пока все нормально.
Astartes вне форума  
 
Непрочитано 10.11.2012, 17:13
#39
bboysyndrom

инженер-конструктор
 
Регистрация: 07.12.2011
Уфа
Сообщений: 121


В AutoCAD 2012 (2009 тоже) последний лисп пишет "Отрезок не создан". В чем проблема может быть?
bboysyndrom вне форума  
 
Непрочитано 10.11.2012, 18:48
#40
VVA

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


Цитата:
(or (entmake (list '(0 . "LINE")
'(6 . "ACAD_ISO04W100")
'(370 . 20)
(cons 10 (trans (mapcar '* '(0.5 0.5 0.5) (mapcar '+ x05 x06)) 0 1))
(cons 11 (trans (mapcar '* '(0.5 0.5 0.5) (mapcar '+ x03 x04)) 0 1))))
(princ "\nОтрезок не создан!")))
Цитата:
Сообщение от bboysyndrom Посмотреть сообщение
В чем проблема может быть?
Скорее всего в выделенным красным. Подгрузи предварительно тип линии ACAD_ISO04W100
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание средней (осевой) линии или биссектрисы.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Создание линии типа "_______текст_______ " с возможностью изменение текста xabraxabra AutoCAD 18 03.10.2011 02:35
LISP Создание осевой линии для 3Dsolids nem LISP 7 19.10.2010 12:42