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

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

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

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

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

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

может есть более легкое решение?
Просмотров: 9792
 
Непрочитано 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
С.-Петербург
Сообщений: 40,431


Димас, а что конкретно тебе надо там рисовать? Почему бы не использовать _.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,837


Цитата:
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,996


Вот набросал побыстрому
Код:
[Выделить все]
(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,996


По поводу разноцветности:
Можно заранее создать эти слои и назначить им цвета
(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
С.-Петербург
Сообщений: 40,431


ИМХО - тут проблема в первую очередь в том, что (судя по чертежу) расстояние "гуляет". Т.е. _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,413
Отправить сообщение для Александр Ривилис с помощью 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 Лентяй
спасибо огромное - такой множитель тоже пригодится
Димас вне форума  
 
Непрочитано 19.07.2006, 06:49
#21
Profan


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


Для Лентяй.
Поскольку неизвестно, к кому относятся ваши слова о запущенности, то придется принять их на свой счет. Я тоже не знал, как должны быть расположены полилинии относительно базовой полилинии, поэтому выбрал симметричное расположение. Но вот в вашей программе полилинии размножаются или внутрь контура или наружу в зависимости от направления отрисовки базовой полилинии. Хорошо ли это? Димас ведь хотел, чтобы полилинии были разного цвета, почему же у вас они одного цвета? Я знаю, вы крутой программист, поэтому в вашей программе невозможно разобраться новичку в AutoLisp'е. Моя программа проста и в ней сможет разобраться и Димас. Это, конечно, не оправдание, но что там с запущенностью? Логичным было бы ожидать от вас программу, которая сразу рисовала бы 4 полилинии на разных слоях и со своим цветом, а не размножала бы их в непредсказуемом направлении. Это было бы эффектно.
Profan вне форума  
 
Автор темы   Непрочитано 19.07.2006, 08:09
#22
Димас

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


to Profan
спасибо что оценили мои способности) но к сожалению до конца в вашей программе я разобраться не смог))
попытался вбить в код на какое расстояние смещать и избавиться от "(setq pt2 (getpoint "\n Укажите точку снаружи контура."))"
к сожалению сразу не вышло (т.е. чтоб смещение было только в одну сторону)
очевидно мне нужно срочно учить лисп, хотя бы основы

а программа для клонирования полилиний от Лентяй пришла вовремя - есть файлы, где уже нарисована одна полилиния, ее так же нужно клонировать, до этого пользовался такими макросами:
^C^C_offset;0.2;
затем ^C^C_change;L;;P;LA;Line_2;;
затем опять ^C^C_offset;0.2;
затем ^C^C_change;L;;P;LA;Line_3;;
и т.д.
в один макрос все собрать не получилось

to Лентяй
не подскажите как в вашей программе задать смещение?
пока что пользуюсь такой конструкцией *^C^C_QTRPL;\0.2;
через пень колоду, но работает)
Димас вне форума  
 
Непрочитано 19.07.2006, 08:22
#23
Лентяй

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


Цитата:
Profan: Поскольку неизвестно, к кому относятся ваши слова о запущенности, то придется принять их на свой счет.
Под запущенностью я подразумеваю манеру повторять одно и тоже действие путем копирования соотв. ЛИСП-выражения, вместо применения функций lambda или repeat, а также создавать примитивы с помощью command, а не entget, не говоря уже о функциях vla-add, работать с которыми намного проще.
Цитата:
Но вот в вашей программе полилинии размножаются или внутрь контура или наружу в зависимости от направления отрисовки базовой полилинии. Хорошо ли это? Димас ведь хотел, чтобы полилинии были разного цвета, почему же у вас они одного цвета?
А вот это - неправда ваша. Посмотрите внимательно - у меня ведь написано "с проверкой существования слоев "PL_1" - "PL_4"", т.е. если слоев нет, то они создаются. Откуда же я могу знать, какими свойствами эти слои предпочтет наделять Димас? Поэтому они по умолчаню создаются такими же, как и активному слой, т.е. тот, на котором была создана полилиния. Если после первого применения программы свойства вновь созданнных слоев изменить, то соотв клоны изменятся тоже.
Цитата:
Я знаю, вы крутой программист, поэтому в вашей программе невозможно разобраться новичку в AutoLisp'е. Моя программа проста и в ней сможет разобраться и Димас.
Вся моя "крутизна" исчерпывается внимательным чтением раздела "HELP". В то же время, я знаю немало людей, для которых и это - труд подчас непосильный. Ничего личного, прочсто наблюдение.
Цитата:
Логичным было бы ожидать от вас программу, которая сразу рисовала бы 4 полилинии на разных слоях и со своим цветом, а не размножала бы их в непредсказуемом направлении. Это было бы эффектно.
Моя программа как раз это и делает. Впрочем. держите вариант в виде реактора. размножает полилинии сразу же после отрисовки основной.
Код:
[Выделить все]
(if (not adoc) (progn (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
                            lyrs (vla-get-Layers adoc)
                            util (vla-get-Utility adoc));setq
  (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)))));if
(if *vlr-cmd* (progn (setq *vlr-cmd* nil) (vlr-remove-all :vlr-command-reactor))) 
(if (not *vlr-cmd*) (setq *vlr-cmd* (vlr-command-reactor "cmd"
  '((:vlr-commandwillstart . cmd-start) (:vlr-commandended . cmd-end)
    (:vlr-commandcancelled . cmd-cancel) (:vlr-commandfailed . cmd-fail)))));if
;
(defun cmd-start (react cmd)
  (setq cmd_nm (strcase (car cmd) t)
        csp (vlax-get-property adoc (if (= (getvar "CVPORT") 1) 'Paperspace 'Modelspace))
        n (vla-get-count csp))
);cmd-start
;
(defun cmd-end (react cmd / pl0 pl pt dist m)
  (if (= cmd_nm "pline") (progn
      (setq om (getvar "OSMODE")
            pl0 (vla-item csp n) m 1)
      (setvar "OSMODE" 0)
      (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-3d-point (vlax-curve-getEndPoint pl0))
                     (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
      (setvar "OSMODE" om));progn
    (princ));if
);cmd-end
;
(defun cmd-cancel (react cmd / om)
  (if (= cmd_nm "pline") (setvar "OSMODE" om))
);cmd-cancel
;
(defun cmd-fail (react cmd / om)
  (if (= cmd_nm "pline") (setvar "OSMODE" om))
);cmd-fail
Лентяй вне форума  
 
Непрочитано 19.07.2006, 09:24
#24
Profan


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


Для Лентяй.
С таким понятием запущенности я согласен. Действительно, мое совершенствование в AutpLisp закончилось несколько лет назад, когда я вынужден был покинуть отдел автоматизации проектирования. Однако, я думаю, что многие участники форума, которые выкладывают здесь свои программы, делают это с искренним желанием помочь, а не на потеху другим, более опытным товарищам. А у вас я заметил такую особенность - язвить и потешаться даже над программами людей достаточно опытных. Но, может, это и не плохо. Я вот предполагал, что Димас в моей программе сам сможет записать в код нужные названия слоев с нужными цветами. По-моему, это место прозрачно в коде. Но вы, кажется, не обратили внимания на мои слова о том, что полилиния может размножаться в непредсказуемом направлении в зависимости от направления отрисовки контура. Может, это для Димас и не существенно, однако программа может применяться и другими пользователями, для которых это существенно. Это я говорю о первой вашей программе. Вторую только буду пробовать. Но вот что мне интересно. Можно ли создать программу, которая сразу отрисовывала бы 4 (или другое число) полилинии, причем каждая на своем слое, так же, как отрисовывается мультилиния. Отрисовывалась c резиновой нитью, а не размножалась.
Profan вне форума  
 
Автор темы   Непрочитано 19.07.2006, 09:45
#25
Димас

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


Цитата:
Сообщение от Profan
...Но вот что мне интересно. Можно ли создать программу, которая сразу отрисовывала бы 4 (или другое число) полилинии, причем каждая на своем слое, так же, как отрисовывается мультилиния. Отрисовывалась c резиновой нитью, а не размножалась.
с точки зрения пользователя (меня) :) отрисовка c резиновой линией намного упрощает процесс
это был один из "+" за использование мультилинии

может сделать так - пользователь отрисовывает мультилинию (при отрисовке видно резиновые линии), затем она удаляется и по тем же точкам рисуются полилинии по разным слоям, затем смещаяются?

а как по другому можно реализовать отрисовку сразу 4-х резиновых линий?
Димас вне форума  
 
Непрочитано 19.07.2006, 10:47
#26
VVA

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


>Димас
Цитата:
пользуюсь такой конструкцией *^C^C_QTRPL;\0.2;
через пень колоду, но работает)
Почему, это не пень-колода, есть запрос->есть на него ответ.
Цитата:
не подскажите как в вашей программе задать смещение?
Немного поясню -> там есть переменная dist0 - она глобальная, т.е. ее последнее значение сохраняется на все время сеанса редактирования рисунка. Так что можно отвечать как в твоем макросе, а можно пустым вводом так
Код:
, тогда менять расстояние через лисп
Код:
[Выделить все]
(setq dist0 0.2)
Я немного поменял местами запросы, сначала расстояние, а затем в цикле выбор полилиний. Я понял * служила для этого.

Код:
[Выделить все]
(defun C:QtrPL ( / adoc lyrs util pl0 pl dist m)
  (setq dist0 (if (numberp dist0) dist0 0.2)
	dist0 (VL-PRINC-TO-STRING dist0))
  (princ "\nLast saved distance - ")(princ dist0)
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)) 
        lyrs (vla-get-Layers adoc) 
        util (vla-get-Utility adoc)) 
  (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-InitializeUserInput util 2)
  (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda () 
        (setq dist (vla-getreal util  
                     (strcat "\nEnter Distance <" dist0 ">: "))))))
      (setq dist (atof dist0)))
  (while (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda ()
             (vla-getEntity util 'pl0 'pt "\nSelect Polyline to Quatriplate <exit>")))))
  (vla-put-Layer pl0 "PL_1")
  (setq m 1 pl nil)  
  (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
    );_while
  (setq dist0 dist)
  (setvar "MODEMACRO" (strcat "Dst:" (VL-PRINC-TO-STRING dist0)))
  (princ)
);end
(defun C:Sdist0 ( / ds )
  (setq dist0 (if (numberp dist0) dist0 0.2))
  (princ "\nВведите смещение полилиний <")(princ dist0)(princ ">: ")
  (initget 1)
  (setq dist0 (if (setq ds (getreal)) ds dist0))
  (setvar "MODEMACRO" (strcat "Dst:" (VL-PRINC-TO-STRING dist0)))
  (princ))
Тогда кнопка для команды
Код:
Для изменения значений
Код:
В левом нижнем углу будет писаться последнее значение, типа "Dst:4"
И самое главное. если число Dist0 < 0, то , будет строится полилиния "внутрь", если Dist0 >0, то наружу.
Цитата:
Distance

Double; input-only
The distance to offset the object. The offset can be a positive or negative number, but it cannot equal zero. If the offset is negative, this is interpreted as being an offset to make a "smaller" curve (that is, for an arc it would offset to a radius that is "Distance less" than the starting curve's radius). If "smaller" has no meaning, then it would offset in the direction of smaller X, Y, and Z WCS coordinates.
VVA вне форума  
 
Непрочитано 19.07.2006, 10:56
#27
VVA

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


Там закралась опечаточка
Код:
[Выделить все]
(defun C:Sdist0 ( / ds )
  (setq dist0 (if (numberp dist0) dist0 0.2))
  (princ "\nВведите смещение полилиний <")(princ dist0)(princ ">: ")
  (initget 2)
  (setq dist0 (if (setq ds (getreal)) ds dist0))
  (setvar "MODEMACRO" (strcat "Dst:" (VL-PRINC-TO-STRING dist0)))
  (princ))
По поводу "внутрь", "наружу" если полилинии пошли не туда, то достаточно поменять dist0 на противоположное значение
VVA вне форума  
 
Непрочитано 19.07.2006, 11:33
#28
Лентяй

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


VVA, у меня к вам неск. вопросов, потому как мне не совсем понятна ваша логика.
1.
Код:
[Выделить все]
(princ "\nLast saved distance - ")(princ dist0)
Насколько я понимаю, последнее примененное значение dist0 показывается в сторке приглашения
Код:
[Выделить все]
"\nEnter Distance <" dist0 ">: "
. Так что за чем это все нужно во-первых, и если ввам это уж так нужно. то почему не
Код:
[Выделить все]
(princ (strcat "\nLast saved distance - " dist0 )
во-вторых. К моменту вывода строки dist0 ведь уже преобразовано в строку не так ли?

2. Исходная полилиния pl0 выбирается только однин раз в начале цикла и значение переменной pl0 в течение цикла не изменяется. Почему тогда вы заменили if на while?

3. Значение переменной pl обнуляется при заканчивании программы. Для чего вам нужно еще одно присваивание pl nil в теле самой программы?

4. Значение отступа вводится заново либо подтверждается при запросе
Код:
[Выделить все]
(setq dist (vla-getreal util (strcat "\nEnter Distance <" dist0 ">: ")))
Зачем вам нужна отдельная функция для этого запроса? Или вы решили размножать не только полилнии, но и кнопки?

И последнее.
Код:
[Выделить все]
(setq dist0 (if (numberp dist0) dist0 0.2)
        dist0 (VL-PRINC-TO-STRING dist0))
мне нравится больше. чем мое собственное
Код:
[Выделить все]
(setq dist0 (if (null dist0) "" (rtos dist0 2)))
Так что за это - наша вам нижайшая благодарность и решпект.[sm3514]
Лентяй вне форума  
 
Автор темы   Непрочитано 21.07.2006, 01:45
#29
Димас

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


спасибо за программу)

вот это
Цитата:
Сообщение от VVA
...В левом нижнем углу будет писаться последнее значение, типа "Dst:4"....
я убрал, у меня там вид текущий пишется)

и все таки, как реализовать отрисовку 4-х резиновых полилиний?
Димас вне форума  
 
Непрочитано 21.07.2006, 10:20
#30
VVA

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


>Лентяй № 28
1.1 Я предполагал, что не всем может понравится MODEMACRO (так и вышло), поэтому информировал пользователя через princ
1.2
Цитата:
то почему не
Код:
(princ (strcat "\nLast saved distance - " dist0 )
во-вторых. К моменту вывода строки dist0 ведь уже преобразовано в строку не так ли?
1+1=2 , т.е что (princ ...)(princ ...), что (princ (strcat ...)) и там и там вызов 2-х ф-ций, разве что princ работает медленее чет strcat, но в этом случае это не принципиально.
2. IF заменил на while, для того, чтобы вабиралась не один раз
Код:
[Выделить все]
(while (not (vl-catch-all-error-p (vl-catch-all-apply '(lambda () 
             (vla-getEntity util 'pl0 'pt "\nSelect Polyline to Quatriplate <exit>")))))
3. Так как там цикл, то первый раз нужно чтобы vla-offset по проверке (if (null pl) pl0 offset'ил последнюю указанную полилинию
4. Я так понял, что димас хотел один раз ускановить отступ и offset'ить N-ое кол-во полилиний, не утруждая себя подтверждением дистанции. Тогда кнопок становится в 2 раза больше (2 ) вида
^C^C_QTRPL;; и ^C^CSdist0;
И последнее
Я тоже много чего перенял, у меня даже есть файл лентяй.lsp, где складируются интересные на мой взгляд решения по ActiveX для последующего разбора и применения (ради справедливости скажу, что есть еще и fatty.lsp и kpblc.lsp). Но я об этом никому не говорю.
[sm206]
VVA вне форума  
 
Непрочитано 21.07.2006, 12:46
#31
pyatifan


 
Регистрация: 29.10.2005
Нижегородская обл.
Сообщений: 219
<phrase 1=


Тысяча извинений...2 Лентяй: довелось однажды сталкнуться с проблемой локализации програм lisp, написанных при помощи commаnd, т.е. необходимо было ставить "_" типа "_имя команды". Использование entget как-то решает эту проблему?
pyatifan вне форума  
 
Непрочитано 21.07.2006, 22:04
#32
Лентяй

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


Цитата:
Сообщение от pyatifan
Тысяча извинений...2 Лентяй: довелось однажды сталкнуться с проблемой локализации програм lisp, написанных при помощи commаnd, т.е. необходимо было ставить "_" типа "_имя команды". Использование entget как-то решает эту проблему?
Писать ЛИСП-код на уровне command - это тоже самое. это описывать нажатие соотв. кнопок на клаве. Хотя в некоторых случаях, например, когда нужно выполнить "STRATCH", это единственный удобный в среде AutoLISP способ. Посредством же команды entget вы создаете примитив программным способом, описывая его свойства. Локлизация АвтоКАДа при этом значения, есс-но, не имеет. Я лично для создания примитивов предпочитаю средства ActiveX как более удобные. (См. например тему о добавлении вершин в полилинии.)
Лентяй вне форума  
 
Непрочитано 21.07.2006, 23:43
#33
Profan


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


Для Лентяй.
Наверное, вы имели в виду команду "STRETCH" ("РАСТЯНУТЬ").
Наверное, вы имели в виду функцию (entmake), а не команду entget...
Profan вне форума  
 
Непрочитано 22.07.2006, 01:17
#34
Лентяй

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


Цитата:
Сообщение от Profan
Для Лентяй.
Наверное, вы имели в виду команду "STRETCH" ("РАСТЯНУТЬ").
Наверное, вы имели в виду функцию (entmake), а не команду entget...
Имянно, имянно! Чижало писать с больной головой после вчерашняго [sm206] [sm718]
А ваще, что entget, что entmake - не люблю я их [sm3228]
Лентяй вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как рисуя одну полилинию получить сразу 4?

Опции темы Поиск в этой теме
Поиск в этой теме:

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