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

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

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

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

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

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

может есть более легкое решение?
Просмотров: 9307
 
Непрочитано 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,992


>Димас
Цитата:
пользуюсь такой конструкцией *^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,992


Там закралась опечаточка
Код:
[Выделить все]
(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,992


>Лентяй № 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?

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