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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как рисуя одну полилинию получить сразу 4?

Как рисуя одну полилинию получить сразу 4?

Ответ
Поиск в этой теме
Непрочитано 17.07.2006, 07:33 #1
Как рисуя одну полилинию получить сразу 4?
Димас
 
джедай
 
Магадан
Регистрация: 31.01.2005
Сообщений: 460

Псосветуйте как лучше решить следующую проблему. Нужно обводить контуры полилиниями, полилинии должны быть разного цвета, в находится разных слоях, на очень маленьком расстоянии друг от друга (так чтоб при печати они не сливались и не было видно между ними расстояния). Рисовать по 4-ре полилинии рядом долго.

Пока вижу два варианта решения проблемы:
1. рисовать мультилинией (настроить линии на разные цвета), ее взрывать, quick select'ом разносить по разным слоям
2. рисовать полилинию, затем ее offset'ом разносить на нужное расстояние, затем разносить по слоям

может есть более легкое решение?
Просмотров: 9252
 
Непрочитано 17.07.2006, 09:56 Re: Как рисуя одну полилинию получить сразу 4?
#2
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


2а. рисовать одну полилинию, затем программой разносить на нужное расстояние и разносить по слоям
vk вне форума  
 
Автор темы   Непрочитано 17.07.2006, 10:02 Re: Как рисуя одну полилинию получить сразу 4?
#3
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от vk
2а. рисовать одну полилинию, затем программой разносить на нужное расстояние и разносить по слоям
есть такая программа?)
поделитесь пожалуйста, в лиспе сам я не силен, только начинаю осваивать(
Димас вне форума  
 
Непрочитано 17.07.2006, 10:05
#4
oshnik


 
Регистрация: 22.12.2005
СПб
Сообщений: 100
<phrase 1=


На сколько я понял то программа это AutoCAD :roll:
oshnik вне форума  
 
Автор темы   Непрочитано 17.07.2006, 10:11
#5
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


я имел в виду команду автокада _offset
а про какую программу автокада вы говорили?
Димас вне форума  
 
Непрочитано 17.07.2006, 10:13
#6
Кулик Алексей aka kpblc
Moderator

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


Димас, а что конкретно тебе надо там рисовать? Почему бы не использовать _.boundary + _.offset? Потом уже думать насчет разноски. Потому что, как я полагаю, просто так программно сделать подобный финт ушами не получится.
Если б не разноцветность, можно было бы попробовать создать свой тип линии и работать через него.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2006, 10:24
#7
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от kpblc
Димас, а что конкретно тебе надо там рисовать? Почему бы не использовать _.boundary + _.offset? Потом уже думать насчет разноски. Потому что, как я полагаю, просто так программно сделать подобный финт ушами не получится.
Если б не разноцветность, можно было бы попробовать создать свой тип линии и работать через него.
хе хе, к слову, классная подпись уважаемый Ка Пэ Б Л эС))

а в этом случае может помочь _.boundary?

я вложил файл, надеюсь так будет понятней?
нужно делать контуры приемрно такого вида
цвет, толщину, расстояние, порядок цветов еще "не утвердили", то есть возможно будет по другому
[ATTACH]1153117485.dwg[/ATTACH]
Димас вне форума  
 
Непрочитано 17.07.2006, 10:43
#8
Krieger

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


Цитата:
2. рисовать полилинию, затем ее offset'ом разносить на нужное расстояние, затем разносить по слоям
Все-таки наверно лучше офсетом, а потом уж разносить по слоям, но можно маленько автоматизировать, уж если совсем много и одинаково.
Например:
^C^C(setq a (ssget "_:s"));\_offset;\!a;\_Exit;_laymch;_L;;_n
Выбираем полилинию, указываем цифру (на скоко отступать), точку за контуром. Потом появиться окошко с выбором слоя - выбираем слой -> Ок. Новая полилиния будет перемещена в указанный слой.

P.S. Команда _laymch из экспрессов.
Krieger вне форума  
 
Непрочитано 17.07.2006, 10:54
#9
VVA

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


Вот набросал побыстрому
Код:
[Выделить все]
(defun C:PL4 ( / laylist e1 ed pt1 pt2 DIST i)
  (setvar "CMDECHO" 1)
  (command "_UNDO" "_Be")
  (setq laylist '("PL1" "PL2" "PL3" "PL4"));_Список имен слоев
  (command "_.LAYER" "_new"
	   (substr (apply 'strcat
		  (mapcar '(lambda (l) (strcat "," l)) laylist)) 2)
	   "_SET" (car laylist) "")
  (command "_.PLINE" pause)(while (> (getvar "CMDACTIVE") 0) (command pause))
  (setq	e1  (entlast)
	ed  (entget (entlast))
	pt1 (cdar (setq ed (member (assoc 10 ed) ed))) ;_Точка начала 1-го сегмента плинии
	ed  (cdr ed)
	pt2 (cdar (member (assoc 10 ed) ed)) ;_Точка конца 1-го сегмента плинии
       	pt1  (trans pt1 e1 1) ;_Перевод точек в ПСК
	pt2  (trans pt2 e1 1) ;_Перевод точек в ПСК
	DIST 1                ;_!!! Заменить на нужное тебе расстояние
	e1   (list e1 pt1)    ;_Примитив с точкой указания для OFFSET
	ed   (+ (angle pt1 pt2) (* 0.5 PI)) ;_Угол
	i    1) ;_Счетчик
  (foreach item	(cdr laylist)
    (command "_.OFFSET" "_T" e1 (polar pt1 ed (* i DIST)) "")
    (command "_.CHANGE" "_L" "" "_P" "_Layer" item "")
    (setq i (1+ i)))
  (command "_UNDO" "_End")(princ))
OFFSET'иться полилиния будет в сторону против часовой стрелки от первого отрисованного сегмента
VVA вне форума  
 
Непрочитано 17.07.2006, 11:01
#10
VVA

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


По поводу разноцветности:
Можно заранее создать эти слои и назначить им цвета
(setq laylist '("PL1" "PL2" "PL3" "PL4"));_Список имен слоев
А можно назначить цвета в любое удобное время.
VVA вне форума  
 
Непрочитано 17.07.2006, 11:41
#11
Кулик Алексей aka kpblc
Moderator

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


ИМХО - тут проблема в первую очередь в том, что (судя по чертежу) расстояние "гуляет". Т.е. _offset покатит только для последнего (самого правого) варинта.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.07.2006, 12:26 Re: Как рисуя одну полилинию получить сразу 4?
#12
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Димас
Цитата:
Сообщение от vk
2а. рисовать одну полилинию, затем программой разносить на нужное расстояние и разносить по слоям
есть такая программа?)
поделитесь пожалуйста, в лиспе сам я не силен, только начинаю осваивать(
Конкретно такой нет, как то писал похожее, подправить не так уж сложно. Как задавать расстояния, имена слоев? В идеале это какие то фиксированные значения. Или каждый раз вводить с клавы / тыкать мышом?
vk вне форума  
 
Непрочитано 17.07.2006, 12:29
#13
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Простая программа с одинаковым расстоянием между полилиниями.
Код:
[Выделить все]
(defun C:4PLINE ( / echo osm lay pl0 pl1 pl2 pl3 pl4 pt1 pt2)
(setq echo (getvar "CMDECHO"))
(setq osm (getvar "OSMODE"))
(setq lay (getvar "CLAYER"))
      (cond
      ((= (tblsearch "LAYER" "PL_1") nil)
       (command "_-LAYER" "_n" "PL_1" "_c" "10" "PL_1" ""))
      ((= (tblsearch "LAYER" "PL_2") nil)
       (command "_-LAYER" "_n" "PL_2" "_c" "40" "PL_2" ""))
      ((= (tblsearch "LAYER" "PL_3") nil)
       (command "_-LAYER" "_n" "PL_3" "_c" "80" "PL_3" ""))
      ((= (tblsearch "LAYER" "PL_4") nil)
       (command "_-LAYER" "_n" "PL_4" "_c" "140" "PL_4" ""))
      ) ; cond
(princ "\n Построение базовой полилинии.")
(setvar "CMDECHO" 1)
(command "_PLINE")
(while (/= (logand (getvar "CMDACTIVE") 31) 0)
       (command pause)
)
(setq pl0 (entlast))
(setvar "OSMODE" 0)
(initget 7)
(setq offs (getreal "\n Расстояние между полилиниями: "))
(setq pt1 (getpoint "\n Укажите точку внутри контура."))
(command "_offset" (/ offs 2) pl0 pt1 "")
(setq pl1 (entlast))
(command "_offset" offs pl1 pt1 "")
(setq pl2 (entlast))
(setq pt2 (getpoint "\n Укажите точку снаружи контура."))
(command "_offset" (/ offs 2) pl0 pt2 "")
(setq pl3 (entlast))
(command "_offset" offs pl3 pt2 "")
(setq pl4 (entlast))
(command "_change" pl1 "" "_p" "_la" "PL_1" "")
(command "_change" pl2 "" "_p" "_la" "PL_2" "")
(command "_change" pl3 "" "_p" "_la" "PL_3" "")
(command "_change" pl4 "" "_p" "_la" "PL_4" "")
(command "_erase" pl0 "")
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)
Profan вне форума  
 
Автор темы   Непрочитано 18.07.2006, 08:21
#14
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


спасибо огромное всем за ответы
попробовал программы, практически то что нужно
сложно сказать какая лучше)
но пользоваться будем скорее всего программой VVA, из-за разноски по слоям
Димас вне форума  
 
Непрочитано 18.07.2006, 09:32
#15
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Для Димас.
Меня интересует - моя программа у вас нормально отрабатывалась? Интересует потому, что вчера она у меня нормально работала, а сегодня стала вылетать аварийно. Создается только 1 слой "PL_1". Но после замены функции (cond) на (if) опять заработала. Не пойму в чем тут дело.
Profan вне форума  
 
Непрочитано 18.07.2006, 22:07
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Profan
...Создается только 1 слой "PL_1". Но после замены функции (cond) на (if) опять заработала. Не пойму в чем тут дело.
Именно так и должно было быть (видимо на Вас повлияла жара ) Если одно из условий в (cond) выполнилось (а в данном случае это отсутствие слоя PL_1), то он и создается. Все остальные слои не создаются!. Если же поставить (if)'ы, то будут созданы все отсутствующие в чертеже слои.
Александр Ривилис вне форума  
 
Непрочитано 18.07.2006, 22:46
#17
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Для Александр Ривилис.
Именно так. Видимо, у меня во время отладки программы слои уже были созданы, а я об этом и не подумал. В новом рисунке программа, естественно, перестала работать. Только вот Димас не сообщил об аварийном завершении, я и засомневался.
Придется привести исправленный код:
Код:
[Выделить все]
(defun C:4PLINE ( / echo osm lay pl0 pl1 pl2 pl3 pl4 offs pt1 pt2) 
(setq echo (getvar "CMDECHO")) 
(setq osm (getvar "OSMODE")) 
(setq lay (getvar "CLAYER")) 
      (if (= (tblsearch "LAYER" "PL_1") nil) 
          (command "_-LAYER" "_n" "PL_1" "_c" "10" "PL_1" ""))
      (if (= (tblsearch "LAYER" "PL_2") nil) 
          (command "_-LAYER" "_n" "PL_2" "_c" "40" "PL_2" ""))
      (if (= (tblsearch "LAYER" "PL_3") nil) 
          (command "_-LAYER" "_n" "PL_3" "_c" "80" "PL_3" ""))
      (if (= (tblsearch "LAYER" "PL_4") nil) 
          (command "_-LAYER" "_n" "PL_4" "_c" "140" "PL_4" "")) 
(princ "\n Построение базовой полилинии.") 
(setvar "CMDECHO" 1) 
(command "_PLINE") 
(while (/= (logand (getvar "CMDACTIVE") 31) 0) 
       (command pause) 
) 
(setq pl0 (entlast)) 
(setvar "OSMODE" 0) 
(initget 7) 
(setq offs (getreal "\n Расстояние между полилиниями: ")) 
(setq pt1 (getpoint "\n Укажите точку внутри контура.")) 
(command "_offset" (/ offs 2) pl0 pt1 "") 
(setq pl1 (entlast)) 
(command "_offset" offs pl1 pt1 "") 
(setq pl2 (entlast)) 
(setq pt2 (getpoint "\n Укажите точку снаружи контура.")) 
(command "_offset" (/ offs 2) pl0 pt2 "") 
(setq pl3 (entlast)) 
(command "_offset" offs pl3 pt2 "") 
(setq pl4 (entlast)) 
(command "_change" pl1 "" "_p" "_la" "PL_1" "") 
(command "_change" pl2 "" "_p" "_la" "PL_2" "") 
(command "_change" pl3 "" "_p" "_la" "PL_3" "") 
(command "_change" pl4 "" "_p" "_la" "PL_4" "") 
(command "_erase" pl0 "") 
(setvar "CMDECHO" echo) 
(setvar "OSMODE" osm) 
(princ) 
)
Profan вне форума  
 
Автор темы   Непрочитано 19.07.2006, 02:37
#18
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


to Profan
да, все получалось как вы и сказали - сначала работало, потом перестало
попробовал последнюю версию - все работает

to VVA
заменил DIST c 1 на 0.2 выдает отшибку


можно ли сделать такую программу из тех что вы написали?)
не нужно указывать контуры внутр/внешний как у VVA
не вводить каждый раз расстояние между полилиниями (0,2)

пробовал менять сам, но лисп все еще темный лес для меня

и вот такой вопрос, если позже решат поменять расстояние между полилиниями - для уже отрисованных полилиний его скорее всего прийдется менять вручную?
Димас вне форума  
 
Непрочитано 19.07.2006, 04:22
#19
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Бр-р-р, как все запущено! Поскольку неизвестно, как должны располагаються полилинии-клоны относительно основной, то вот простой размножитель с проверкой существования слоев "PL_1" - "PL_4".
Код:
[Выделить все]
(defun C:QtrPL ( / adoc lyrs util pl0 pl dist m)
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
        lyrs (vla-get-Layers adoc)
        util (vla-get-Utility adoc)
        m 1)
  (foreach x '("PL_1" "PL_2" "PL_3" "PL_4")
         (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list lyrs x)))
           (vla-add lyrs x)))                       
  (vla-getEntity util 'pl0 'pt "Select Polyline to Quatriplate")
  (setq dist0 (if (null dist0) "" (rtos dist0 2)))
  (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda ()
        (setq dist (vla-getdistance util (vlax-make-variant pt)
                     (strcat "Select Offset Point or Enter Distance <" dist0 ">: "))))))
      (setq dist (atof dist0)) dist);if
    (setq dist0 dist)
  (vla-put-Layer pl0 "PL_1")
  (repeat 3
    (setq pl (car (vlax-safearray->list (vlax-variant-value (vla-offset (if (null pl) pl0 pl) dist))))
          m (1+ m))
    (vla-put-layer pl (strcat "PL_" (itoa m)))
    (vla-put-color pl 256) (vla-put-Linetype pl "ByLayer"));repeat
);end
Лентяй вне форума  
 
Автор темы   Непрочитано 19.07.2006, 06:43
#20
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


to Лентяй
спасибо огромное - такой множитель тоже пригодится
Димас вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как рисуя одну полилинию получить сразу 4?

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

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