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

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

Повторение выполнения макрокоманды по циклу. КАК?

Ответ
Поиск в этой теме
Непрочитано 02.12.2007, 12:45 #1
Повторение выполнения макрокоманды по циклу. КАК?
Kostinok
 
Инженер-электрик
 
Калининград
Регистрация: 13.10.2007
Сообщений: 151

Возникла проблема автоматического добавления линий, при их рисовании в заранее созданную AutoCADовскую группу.
т.е. необходимо при рисовании линии добавлять ее в группу, другими словами выполнять операции:
1. Рисую линию или полилинию;
2. Создаю AutoCADовскую группу;
3. добавляю (1.) линию в эту группу;
4. рисую след. линию;
5. добавляю (4.) линию в эту группу
6. и т.д.

начал думать над макросом, но не могу понять как завязать вновь начерченную линию, как в пункте 4., В ГРУППУ, как в пункте 3.

не получается с самого начала, даже линия не рисуется, написал следующее: ^C^C_pLine;???\вот тут не знаю как написать, что бы все нормально рисовалось, т.е. мне не надо что бы я мог нарисовать полилинию сколько угодно длиной и сколько угодно раз повернуть ее по своему усмотрению, короче говоря нарисовать обыкновенную полилинию\????;_-Group;_Creat;\;;_last;

Последний раз редактировалось Kostinok, 02.12.2007 в 13:11.
Просмотров: 6050
 
Автор темы   Непрочитано 02.12.2007, 13:23
#2
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Или рисовать линию, потом запоминать ее (setq A (ssget last/если так можно/)), снова рисовать и туда же запоминать (к выделению A), ну а потом уже все это выделение в группу, подскажите пожалуйста как это можно сделать
Kostinok вне форума  
 
Непрочитано 02.12.2007, 14:22
#3
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


как вариант использовать в макросе * в начале макроса для его зацикливания, а внутри макроса, делать join как опция в команде pline, для создания новой вершины и каждый раз новую плинию прописывать в группу, единственное придется if-ом на дизеле разделить процессы когда создается первая вершина и последующие, а вообще задача по-моему достаточно сложная луче на лиспе или вба писать.
Sleekka вне форума  
 
Автор темы   Непрочитано 02.12.2007, 15:46
#4
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Sleekka, да, вроде начинаю тоже доходить, что надо будеть LISP подключать
только вот мне надо знать еще некоторые функции..., да и вообще как с ними правильно работать... Сейчас держу в руках книгу Н.Полещука "AutoCAD разработка приложений настройка и адаптация" - очень помогает ковырятся в уже написанных лиспах, но вот на свои я еще не подрос, не хватает знаний.
Если кто знает как можно это сделать, можт обрадуете... любой помощю или советом.

Вот скажите как написать, что бы: (если просто в AutoCADе нарисовать линию, потом, к примеру, нажать _move, то ведь не обязательно показывать снова ту линию - что бы ее перетащить, достаточно написать _Last, потом указать точку 1 и точку 2 - куда надо, вот!), нарисовав линию добавить ее в набор (функция ssget), после, если необходимо снова рисовать линию, но уже к существующему набору добавлять и ее. Но ведь для этого надо рисовать это как бы "новой" линией, т.е. не обыкновенной. Результат должен быть: Я рисую положим 5 разных полилиний, в это время все они у меня оказываются в наборе, потом я рисую обыкновенной линией, ну подправил что нибудь и еще как нибудь, а потом опять "новой" и AutoCAD спрашивает а к какому набору вас добавлять? В принципе набор может быть один, потому как если набор заканчивается, т.е. это мы с клавиатуры или еще как-то его закончили, AutoCAD весь уже сформированный набор складывает в группу, и нам останется только лишь написать название группы, при этом исходе наш набор может обнулиться и можно снова набирать новую группу...

Последний раз редактировалось Kostinok, 02.12.2007 в 16:01.
Kostinok вне форума  
 
Непрочитано 02.12.2007, 20:22
#5
Кулик Алексей aka kpblc
Moderator

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


Если бы я был уверен, что все верно понял... А так, в качестве идеи: можно сделать несколько отдельных команд.
1-я запоминает состояние файла.
Дальше рисуется все что угодно.
2-я с точки, которую запомнила 1-я, добавляет все нарисованные примитивы в новую группу.
Есть тут, конечно, пара тонкостей, в частности, то, что примитивы должны находиться в одном пространстве (листа или модели), не входить в блок / внешнюю ссылку; практически гарантированно возникнет вопрос с удалением примитивов "до точки 1".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.12.2007, 10:38
#6
VVA

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


Может почерпнешь какие идеи здесь?
http://www.caduser.ru/cgi-bin/f1/board.cgi?t=22733Nt
http://www.caduser.ru/cgi-bin/f1/board.cgi?t=33159gI
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.12.2007, 13:28
#7
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Кулик Алексей aka kpblc, т.е. имеется ввиду: 1 програмаа запоминает все текущие настройки: слои, тип линий и т.п. И самое Главное какие на чертеже есть ПРИМИТИВЫ и где они расположены, т.е. "сфотографировать" чертеж, а 2-я программа сравнивает конечный результат рисования и как бы "вычисляет разность" м/у чем было и что стало...
Ну а потом эти программы наверняка можно объеденить...!

Идея классная, но вот как? в принципе, я сейчас наверно смогу запомнить все настройки AutoCADа в текущем чертеже - это, как я понимаю, делается "записыванием" системных переменных, наверно даже можно записать все координаты примитивов, но только вот это я уже смутно представляю как это делается...
А вот про вторую программу вообще не понял!(как она должна "разность" вычеслять, по каким правилам?)
Можт было бы легче рисовать в отдельном слое, а потом, когда рисование окончилось, выделить(тож конечно в по средствам LISPа) все примитивы слоя и запихнуть в группу - а так можно?
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/

Последний раз редактировалось Kostinok, 03.12.2007 в 13:33.
Kostinok вне форума  
 
Непрочитано 03.12.2007, 13:37
#8
Кулик Алексей aka kpblc
Moderator

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


Первая "программа":
Код:
[Выделить все]
(defun c:start-for-group ()
  (setq *mail-entlast* (entlast))
  (princ)
  ) ;_ end of defun
Вторая "программа":
Код:
[Выделить все]
(defun c:end-for-group (/ ent selset)
  (if (and (setq ent *mail-entlast*)
           (setq selset (ssadd))
           ) ;_ end of and
    (progn
      (while (setq ent (entnext ent))
        (setq selset (ssadd ent selset))
        ) ;_ end of while
      (command "_.group" "_c" "*" "" selset "")
      (setq *mail-entlast* nil)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Они вообще не проработаны, в отличие от ссылки, которую показал VVA
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.12.2007, 14:15
#9
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Может нечто такое сгодится?
Код:
[Выделить все]
(defun c:grouper (/ ent selset)
  (setq ent (entlast))
  (while (progn (initget "Выход")
                (vl-cmdf "_.pline" (getpoint "\nРисовать полилинию <Выход>: "))
         )
    (while (not (zerop (getvar "cmdactive"))) (vl-cmdf pause))
  )
  (setq selset (ssadd))
  (while (setq ent (entnext ent)) (setq selset (ssadd ent selset)))
  (vl-cmdf "_.group" "_c" "*" "" selset "")
  (princ)
)
набросок, не более
Alaspher вне форума  
 
Автор темы   Непрочитано 03.12.2007, 16:08
#10
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Alaspher, спасибо, все работает, надо только что бы можно было группу создавать самому, имеется ввиду название, если бы это был макрос, то в коде:

вместо "_.group" "_c" "*" "" selset "" писалось бы:
_-Group;_Create;\;;!select - вроде так, и тогда AutoCAD просил бы назвать группу - можно ли это сделать здесь?

И еще возможен ли вообще такой лисп: я запускаю лисп, он мне пишет: Выберите группу, а потом, после выбора, в текстовом окне прописывает сколько эта группа пересекла блоков:
блок под именем
1: 20
2: 35
Дверь: 2
Лампа: 5, и.т.д?
Можно ли вообще этого добиться?
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 04.12.2007, 08:43
#11
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Kostinok Посмотреть сообщение
Alaspher, спасибо, все работает, надо только что бы можно было группу создавать самому, имеется ввиду название, если бы это был макрос, то в коде:

вместо "_.group" "_c" "*" "" selset "" писалось бы:
_-Group;_Create;\;;!select - вроде так, и тогда AutoCAD просил бы назвать группу - можно ли это сделать здесь?
Примерно так:
Код:
[Выделить все]
(defun c:grouper (/ ent gdict gdnam gname selset)
  (setq ent (entlast))
  (while (progn (initget "Выход")
                (vl-cmdf "_.pline" (getpoint "\nРисовать полилинию <Выход>: "))
         )
    (while (not (zerop (getvar "cmdactive"))) (vl-cmdf pause))
  )
  (setq selset (ssadd)
        ent    (if (not ent)
                 (entnext)
                 (entnext ent)
               )
  )
  (while ent
    (setq selset (ssadd ent selset)
          ent    (entnext ent)
    )
  )
  (if (not (zerop (sslength selset)))
    (progn (and (setq gdict (dictsearch (namedobjdict) "ACAD_GROUP"))
                (setq gdnam
                       (mapcar (function cdr)
                               (vl-remove-if-not (function (lambda (a) (= (car a) 3))) gdict)
                       )
                )
           )
           (while (and (setq gname (getstring "\nИмя группы <безымянная>: "))
                       (vl-position (setq gname (strcase gname)) gdnam)
                  )
             (princ (strcat "\nИмя '" gname "' уже есть, выбери другое!"))
           )
           (if (= gname "")
             (setq gname "*")
           )
           (vl-cmdf "_.group" "_c" gname "" selset "")
    )
  )
  (princ)
)
Цитата:
Сообщение от Kostinok Посмотреть сообщение
И еще возможен ли вообще такой лисп: я запускаю лисп, он мне пишет: Выберите группу, а потом, после выбора, в текстовом окне прописывает сколько эта группа пересекла блоков:
блок под именем
1: 20
2: 35
Дверь: 2
Лампа: 5, и.т.д?
Можно ли вообще этого добиться?
Добиться можно, но код немного посложнее будет. Кстати, неплохая задача для изучающих объектные методы лиспописания...

Последний раз редактировалось Alaspher, 04.12.2007 в 14:49. Причина: обнаружены и исправлены существенные недочёты
Alaspher вне форума  
 
Автор темы   Непрочитано 05.12.2007, 13:16
#12
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


Alaspher, спасибо!!! Подсказка про объектные методы это конечно хорошо, для начала мнеб просто лиспу научиться, переменные всякие важные позапоминать, а потом и к методам перейти. Так что если не затруднит, как поднаизучаюсь - буду обращаться за подсказками
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 05.12.2007, 15:40
#13
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Kostinok
Обращайся - на то и форум
Alaspher вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Повторение выполнения макрокоманды по циклу. КАК?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как именно настроить параметры нового чертежа? Макс_Северянин AutoCAD 31 01.09.2010 10:16
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46