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

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

Быстрое выделение одинаковых блоков.

Ответ
Поиск в этой теме
Непрочитано 24.03.2004, 12:00 #1
Быстрое выделение одинаковых блоков.
Mikhail
 
инженер-технолог (ГИП)
 
Санкт-Петербург
Регистрация: 11.09.2003
Сообщений: 1,140

Доброго времени суток.
Не подскажите как сделать не на Лиспе, а просто макрос быстрое выделение блоков одного имени?
Есть команда Qselect но она в виде диалога вроде не работает...
Спасибо.
Просмотров: 8036
 
Непрочитано 24.03.2004, 12:14
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Qselect, прекрасно работает через диалоговое окно (см. картинку). Как сделать через макрос не знаю. А через ЛИСП минуты за 3 можно слепить такой вариант, щелкаете по одному блоку и сразу выбираються все одноименные.
[ATTACH]1080119678.gif[/ATTACH]
{Smirnoff} вне форума  
 
Непрочитано 24.03.2004, 12:40
#3
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Поставь не кнопочку, и не мучайся:
Код:
[Выделить все]
(defun c:bsel (/)
  (setvar "cmdecho" 0)
  (sssetfirst
    nil
    (setq bSet
	   (ssget
	     "_X"
	     (list
	       (assoc 2 (entget (car (entsel "Select sample block: "))))
	     )
	   )
    )
  )
  (terpri)
  (princ(strcat "*** "(itoa(sslength bSet)) " bloks selected ***"))
  (princ)
)
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 24.03.2004, 13:30
#4
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


Спасибо.
Буду использовать ЛИСП жаль только времни нет на его изучение.
Удачи.
Mikhail вне форума  
 
Непрочитано 24.03.2004, 14:37
#5
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


А Filter тоже не подходит?
Эдуард вне форума  
 
Автор темы   Непрочитано 26.03.2004, 10:05
#6
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


Filter не подходит по тем же причинам что и qselect ефм вроде нет диалога, который можно было бы записать в макрос.

to Fantomas
А что надо в лиспе изменить чтобы лисп работал не по выделению а по названию блока. Ну чтобы в процессе выполнения макроса данный лисп выбирал несколько видов блоков по названию. Название блока задается в самом макросе допустим...
Думаю это не сложно, просто мне сейчас не понятно
Mikhail вне форума  
 
Непрочитано 26.03.2004, 10:40
#7
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Можно конечно. Можно, точно также щелкать, но по нескольким блокам. Можно сделать ввод названия нескольких блоков с клавиатуры, можно чтобы при запуске программы она сначала выдавала в текстовом окне список всех блоков с номером который потом можно ввести вместо полного имени и количеством блоков на чертеже:
[1] Block1 (25)
[2] Block2 (11)
......................

Потом запрос в командной строке, допустим:

Enter Block Numbers to select: 1,8,44

И прога выберет блоки 1, 8 и 44.

На худой случай можно написать диалоговое окно. Как сделать?
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 26.03.2004, 11:09
#8
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


Глаза разбегаются... :shock: , спасибо.

Мне наверное будт хватать и того чтобы прога запршивала в виде аргумента название блока и потом его выделяла, а чтобы выделить несколько разных блоков я думаю просто повторный вызов этой проги из лиспа подойдет.
Так что мне надо чтобы прость выделялась куча нужных блоков, сами названия блоков хотелось бы прописать уже в самом макросе, куда вставляется ЛИСП.

Спасибо.
Mikhail вне форума  
 
Непрочитано 26.03.2004, 11:52
#9
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Ну можно и так. Я все равно собирался писать подобного типа прогу, правда выбирать блоки она должна в соответствии с расширенными данными в них содержащимися. Вот уже и "скелетик" небольшой будет... Лучше я вначале сделаю выбор:

Specify selection method [on Screen/from List/enter Name] <N>:

В конце репортаж:

*** Blocks Selected:
Block1: 18
Block2: 4
.............................

-----------------------
Total: 231

Немного придется подождать, хотя наверное на выходных найду время.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 26.03.2004, 15:21
#10
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


Спасибо.
Буду ждать, а заодно постараюсь начальство на книгу про ЛИСП расскуртить
Удачи.
Mikhail вне форума  
 
Непрочитано 28.03.2004, 11:25
#11
Лентяй


 
Сообщений: n/a


Трудолюбцы! Команду (ssx) никто не пробовал? Она позволяет выбирать ВСЕ примитивы согласно устовновкам фильтра - по имени блока, типу примитва, слою, цвету, и т.п. Я ей пользуюсь и вам советую.
 
 
Непрочитано 29.03.2004, 10:19
#12
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Да хорошая команда, я и не знал о ее существовании.

>Mikhail По моему идеально подходит для макросов с выбором объектов. За выходные неуспел ничего написать. Если SSX, чем то неудовлетворяет, скажите напишу. Просто смотрю что с этой командой необходимость вроде как отпадает.

>Лентяй Не стал разбираться, подскажите где "живет", родная или из Express Tools?
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 29.03.2004, 11:17
#13
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


>Лентяй.
СПАСИБО.
Классная команда диалоговая то что надо.
Думаю этого мне хватит. А вопрос Fantomas`a актуален откуда она из Експрессов или стандартная?
Спасибо.
>Fantomas. Думаю я пока этой командой ограничусь. Спасибо.
Mikhail вне форума  
 
Непрочитано 31.03.2004, 03:35
#14
Лентяй


 
Сообщений: n/a


Express'ные оне...
 
 
Автор темы   Непрочитано 15.02.2005, 15:20
#15
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


Цитата:
Сообщение от Fantomas
Можно конечно. Можно, точно также щелкать, но по нескольким блокам.
Вот возникла небольшая необходимость, если нетрудно может кто дополнит программу, а то я если честно пас
В общем нужен выбор всех определенных блоков в чертеже. Определить какие блоки нужны наверное текстово, а может и указанием. не знаю что лучше пока.
Спасибо.
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 15.02.2005, 18:48
#16
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Отметить образцовые блоки, программа выделит их, посчитает и выдаст репортаж на текстовый экран:
Код:
[Выделить все]
(defun c:mbsel (/ firstSet filList eCount outList curIns curSet)
  (vl-load-com)
  (princ "\n*** Select sample blocks and press Enter *** ")
(if
  (setq firstSet(ssget '((0 . "INSERT"))))
   (progn
   (setq filList '((0 . "INSERT")(-4 . "<OR"))
	eCount 0
	outList '()
	); end setq
  (repeat(sslength firstSet)
    (if(not(member
	     (setq curIns(assoc 2(entget(ssname firstSet eCount))))filList))
      (progn
	(setq filList(append filList(list curIns))
	      curSet(ssget "_X" (list curIns '(0 . "INSERT")))
	      outList(append outList(list(list(cdr curIns)(sslength curSet))))
	      eCount(1+ eCount)
	); end setq
      ); end progn
      ); end if
    ); end repeat
  (setq filList(append filList '((-4 . "OR>"))))
  (princ "\nBLOCKS SELECTED: ")
  (princ "\n---------------------------------")
  (foreach name outList
    (princ(strcat "\n" (car name) " " (itoa(cadr name))))
    ); end foreach
  (princ "\n---------------------------------")
  (princ(strcat "\nTotal blocks selected: "(itoa(apply '+(mapcar 'cadr outList)))))
  (sssetfirst nil(ssget "_X" filList))
); end progn
(princ "\n*** Nothing selectrd! ***")
); end if
  (princ)
  ); end of c:mbsel
Считает выбранное, дает репортаж и если надо экспортирует данные в Excel:
Код:
[Выделить все]
(princ "\nType BLCX to run.")

(defun c:blcx(/ blSet blList nameList listLen outList exFlag oldExFlag
         exPath exApp exWorkbook exFileexSheets exSheet curId
         newFile curCell curVal)

  (vl-load-com)
 
  (princ "\n*** Specify selection set for block counting ***")
  (if(setq blSet(ssget '((0 . "INSERT"))))
    (progn
      (setq blList(mapcar 'vlax-ename->vla-object
                    (vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex blSet))))
       nameList(vl-sort (mapcar'(lambda(x)(vla-get-Name x)) blList) '<)
       listLen(length nameList)
       ); end setq
      (while nameList
  (setq outList (cons(cons(car nameList)
           (- listLen(setq listLen(length (setq nameList
      (vl-remove(car nameList) nameList))))))outList)
        ); end setq
  ) ; end while
      (princ "\n********** BLOCK COUNTING REPORT ************\n ")
      (foreach item outList
   (princ(strcat "\n" (car item)" "(itoa(cdr item))))
   ); end foreach
      (princ "\n \n************* END OF REPORT *****************")
      (textscr)
      (if(not exFlag)(setq exFlag "N"))
      (setq oldExFlag exFlag)
      (initget "Y N")
      (setq exFlag
        (getkword
      (strcat "\n\n*** Save report to MS Excel file? [Y/N] <"exFlag">: ")))
      (if(null exFlag)(setq exFlag oldExFlag))
      (if(= exFlag "Y")
   (progn
      (if (setq  exPath(getfiled "Save Text File As"
           (strcat (getvar "dwgprefix")(substr (getvar "dwgname") 1
      (- (strlen (getvar "dwgname")) 4)) ".xls")"xls" 33); end getfiled
            ); end setq
        (progn
   (setq exApp(vlax-create-object "Excel.Application"))
   (if(null exApp)
     (progn
       (alert "Error. Can't start MS Excel.")
       (quit)
       ); end progn
       ); end if
    (setq exWorkbook
              (vlax-get-property exApp "Workbooks")
          exFile
              (vlax-invoke-method exWorkbook "Add")
          exSheets
              (vlax-get-property exFile "Worksheets")
               exSheet
              (vlax-get-property exSheets "Item" "Sheet1")
          curRow 2
   ); end setq
     (repeat(length outList)
       (setq curId(strcat "B"(itoa curRow))
        curCell(vlax-variant-value
               (vlax-invoke-method exSheet "Evaluate" curId))
        curVal(car(nth(- curRow 2) outList))
        ); end setq
        (vlax-put-property curCell  "Formula" curVal)
       (vlax-release-object curCell)
       (setq curId(strcat "C"(itoa curRow))
        curCell(vlax-variant-value
               (vlax-invoke-method exSheet "Evaluate" curId))
        curVal(itoa(cdr(nth(- curRow 2) outList)))
        ); end setq
        (vlax-put-property curCell  "Formula" curVal)
       (vlax-release-object curCell)
       (setq curRow(1+ curRow))
       ); end repeat
     (vlax-invoke-method exFile "SaveAs" exPath nil nil nil nil nil nil)
     (vlax-invoke-method exFile "Close" nil)
     (vlax-invoke-method exApp "Quit")
    (mapcar(function(lambda(x)
          (if
       (and x(not(vlax-object-released-p x)))
       (vlax-release-object x)
       )
          ))
    (list curCell exSheet exSheets exFile exWorkbook exApp)
    )
    (setq curCell nil
          exSheet nil
          exSheets nil
          exFile nil
     exWorkbook nil
     exApp nil); end setq
    (gc)
   (princ(strcat"\n*** The file was successfully saved in: " exPath))
   ); end progn
        (princ "\n*** Excel file was not created! *** ")
        ); end if
       ); end progn
      ); end if
    ); end progn
    (princ "\n*** Nothing blocks selected! ***")
  ); end if
      (princ)
      ); end of BLCX
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 16.02.2005, 12:26
#17
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


Спасибо.
Я эту тему поднял потому, что еще возникла необходимость в выделении многих разноименных блоков. http://dwg.ru/forum/viewtopic.php?t=2927&start=45 Вот и пытюсь как то все слепить... [sm2400]
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 16.02.2005, 13:29
#18
kserg


 
Регистрация: 22.04.2004
Сообщений: 269


А в каких Express-ах эта самая функция (ssx) - в 2005 ?
kserg вне форума  
 
Автор темы   Непрочитано 16.02.2005, 13:32
#19
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,140


Цитата:
Сообщение от kserg
А в каких Express-ах эта самая функция (ssx) - в 2005 ?
у меня и в 2004 работает... Хотя вроде экспрессы для 2004 АКДА это теже что и для 2002.
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 16.02.2005, 15:50
#20
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Я эту тему поднял потому, что еще возникла необходимость в выделении многих разноименных блоков. http://dwg.ru/forum/viewtopic.php?t=2927&start=45 Вот и пытюсь как то все слепить... [sm2400]
Так на VBA это и надо делать... Так что лучше озадачить VK.
{Smirnoff} вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Быстрое выделение одинаковых блоков.

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

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