|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
vba, как посчитать количество блоков с помощью item и handle?
Регистрация: 08.03.2018
Сообщений: 45
|
||
Просмотров: 10079
|
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
написать свое извлечение данных.. и на VBA это реализуется
----- добавлено через ~12 мин. ----- например, перебором thisdrawing.modelspace.items либо используя фильтры в наборах, если нужно определенные примитивы. Это будет работать гораздо надежнее, чем ваше решение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
какой алгоритм в коде реализовали - такое число и получили) Приводите пример кода и файла, если хотите получить определенный ответ. И переименуйте тему тогда, указав - на каком языке пишете и что хотите реализовать. Модераторы потом все равно попросят это сделать)
|
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
Код:
----- добавлено через ~2 мин. ----- что то очень мутное с handle и handletoobject.. нигде нет толковой инфы или я как то плохо гуглю.. и раньше натыкался на эти темы но не мог разъяснения найти.. точно такой метод позволит мне вообще вытащить количество блоков полилиний ( и длину их), и параметры дин блоков? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
blocks - это определения блоков, а не их вставки. Разницу между определением блока и его вставкой понимаете хоть?
Поэтому весь ваш код внутри тела цикла считает все что угодно, кроме количество блоков в чертеже. ======================================================= 1. Получаете примитив из коллекции ThisDrawing.ModelSpace.Item(i) 2. Проверяете - является ли он вставкой блока. И если является - то начинаете обрабатывать его как вставку блока. Иначе пропускаете. ----- добавлено через 42 сек. ----- а про Handle забудьте пока, для данной задачи он не нужен скорее всего. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
прежде чем автоматизировать - надо разобраться в том, что собираетесь автоматизировать.
Тогда может не будете в цикле по коллекции примитивов пространства модели обращаться с переменной этого цикла к элементу коллекции определений блоков. Удивительно, что ошибку не выдало во время исполнения - наверно, чертеж сам пустой еще фактически и не вышли за пределы коллекции определений блоков. ----- добавлено через ~4 мин. ----- использовать TypeOf, например. |
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
спасибо
буду разбираться ----- добавлено через ~15 мин. ----- Код:
----- добавлено через ~16 мин. ----- аа все верно. он же все блоки посчитал... идем дальше спасибо большое за информацию.. есть что почитать теперь) ----- добавлено через ~26 мин. ----- тоже самое с AcadPolyline не работает( и как работать с конкретным блоком(как его имя задействовать)? и его параметрами? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
у конкретной вставки блока нет имени, есть ObjectID и есть Handle. Первое формируется на лету при открытии чертежа *.dwg, второе остается неизменным во всех сессиях открытия чертежа. А вообще, если делаете приблуду для КЖ - поищите на форуме, люди уже выкладывали наработки.
----- добавлено через 32 сек. ----- ну или обрабатывайте непосредственно в цикле ----- добавлено через ~9 мин. ----- и переменная i должна быть long, а не Integer. Так как Count тоже long |
|||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616
|
![]() или под именем имелось ввиду что то другое? Simson, Вы в хелп и документацию принципиально не смотрите? Более подробного хелпа еще поискать нужно, есть примеры по каждому методу и на каждый чих. Фактически можно брать примеры целыми кусками и лепить из них свою поделку. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
параметры определения блока обычно особой смысловой информации не несут, поэтому речь скорее всего идет именно о вставке блока. Конкретную вставку блока по имени его определения определить не получиться (если только в чертеже не используется исключительно по одной вставке блоке на каждое определение и не используются динамические блоки). Поэтому здесь уже надо оперировать теми же хэндлами примитивов. Хотя если ему нужно написать лишь аналог извлечения данных, то надо просто обрабатывать прямо в цикле примитивы в зависимости от их типа.
|
|||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Т.е. проще сделать собственный вариант "извлечения" - во избежание, как говорится
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
Да не только блоки. есть несколько определений блока(динамических) и множественное количество их вставок. в принципе да нужен аналог извлечения данных, т е длины и количества конкретных полилиний( пот типу линии например отобрать) количество вставок блока каждого определения и для каждой вставки их динамические параметры. вот такая простая задача.
----- добавлено через ~4 мин. ----- почему же не vba? на vba не реализуемо? казалось бы базовая задача почему так неочевидно выполняется.. странно странно |
|||
![]() |
|
||||
Цитата:
потом по EffectiveName в цикле отбираешь, только блоки с нужным именем, если это нужный блок в этом же цикле выдергиваешь из него нужные данные, и закидываешь их например в массив потом работаешь только с массивом. с полилинией аналогично.
__________________
Мастерская СПДС |
||||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616
|
Цитата:
В остальном, данная задача решается компоновкой примеров, которые есть в справке. |
|||
![]() |
|
||||
при чем тут выделение... http://vbamodel.narod.ru/AutoCAD/idh...set_object.htm
http://vbamodel.narod.ru/AutoCAD/idh_select.htm задавай фильтры, и обрабатывай выборку, как тебе заблогарассудится, но да дин блок по имени выбрать не получится, обычный легко. Зато можно сделать выборку блоков только с атрибутами, по слою или слоям, с модели или только листов с любого листа или еще как.. и не перебирать тупо в цикле все блоки пространства.
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
Цитата:
----- добавлено через 53 сек. ----- Всем спасибо за наводки буду пробовать |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
все равно с первого раза не получиться конечный вариант) Сначала будете выгребать всякие логические ошибки, потом в процессе работы всплывают какие то рабочие нюансы и снова переделывать. С фильтрами наборов будет быстрее работать, с циклом проще в понимании на первое время. Всегда можно переписать код, используя фрагменты уже отлаженного кода из предыдущих версий)
|
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
это дело понятное. я начал как раз с перебора и осознания всяких методов и свойств дин блоков
что то получается.. количество и имена я все таки изъял а вот со свойствами загвоздка. как задать переменную чтоб ей присвоить свойство дин блока? так не работает: Код:
Последний раз редактировалось Simson, 11.03.2018 в 15:52. |
|||
![]() |
|
||||
мне не совсем...
я понимаю, что ты создаешь очередную супер секретную программу... если не затруднит.. озвучь алгоритм ее работы хотя бы в общих чертах, с чего она начинает и что болжно получиться в итоге... не хочу показаться резким но таких велосипедов уже есть больше чем один. и сообщество возможно даст тебе ссылки на готовое.. если жэж это нечто неординарное.. мне было бы очень интересно и познавательно в этом поучаствовать ----- добавлено через ~1 мин. ----- ЧТО ДОЛЖНО БЫТЬ НА ВЫХОДЕ!
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
может таких велосипедов и полно но пока не наткнулся ни на один.. плохо ищу? возможно..
суть как и говорилось проста.. есть автокад с кучей блоков раскиданных по всему чертежу(благо в одном определенном заранее известном слое) нужно чтоб после изменения и сохранения начинался макрос( с этим я справился), который заключается в следующем: считать все дин параметры блоков их имена и их количества, и количество и длины определенных полилиний.. и всю эту инфу выбросить в ексель.. а там есть классная табличка которая все что нужно посчитает.. сейчас задача стоит собственно лишь в считывании информации из автокада.. все что до и после уже работает ----- добавлено через ~3 мин. ----- на выходе при сохранении автокада в экселе готовые расчитанные данные ----- добавлено через ~5 мин. ----- я это сделал через коммнадную строку встроенной функцией извлечения.. но она выполнялась после кода.. поэтому нужно было сохранить дважды чтоб работало.. Последний раз редактировалось Simson, 11.03.2018 в 17:08. |
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
да я вот как раз сейчас разгребаю в этом направлении..
до этого казалось такое извлечение единственный выход.. застрял на моменте когда присваиваю переменной свойства дин блока. вот здесь ошибку выдает Код:
----- добавлено через ~2 мин. ----- а я из экселя могу достучаться до событий автокада? как же макрос будет запускаться? |
|||
![]() |
|
||||
если не будешь пользовать командные методы, тебе события ... не уперлись.. а для такой простой задачи, как в вебеа извлечь данные из блоков, разобрать их и выплюнуть например в таблицу того жэж автокад.. даже эксель не нужен.. блокнот и расширение файла vbs
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
ну допустим я не использую командные методы. но автокад это такая подвижная субстанция.. все время что то меняется.. поэтому хотелось бы что это автоматически все подгружалось в случае изменения... зря я что ли это пишу? чтоб кнопку запуска макроса самому тыкать каждый раз?
|
|||
![]() |
|
||||
Цитата:
----- добавлено через ~2 мин. ----- даже автодеск это не пользует в своих вертикалках (а они то в курсе).. параметризация и дин блоки с табицами параметров.... это такое г...
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
нет нет. в реальном времени не надо.. я ж все завязал на кнопке сохранения в автокаде.. этого достаточно
----- добавлено через ~1 мин. ----- так я это и не сам придумал.. я нашел пордобные строчки даже с подписанным комментарием" ура спасибо работает" а про справку.. как пользоваться ей правильно? |
|||
![]() |
|
||||
лихко
http://www.autodesk.ru/adsk/servlet/...&siteID=123112 куда уж подробнее ----- добавлено через ~2 мин. ----- для начала прочитать и попытаться понять написанное
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
начинай отсюда
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
пробовал такую переменную создавать DynamicBlockReferenceProperty
это тоже неверно? ----- добавлено через ~34 мин. ----- с блоками разобрался.. возьму что надо.. а полилинии? as acadpolyline он не котирует( ----- добавлено через ~19 мин. ----- Справился всем огромное спасибо! если бы не вы... как бы я без вас ----- добавлено через ~3 ч. ----- вот незадача.. подмогите пожалауйста.. неужели невозможно узнать количество динамических свойств блока? нужно перебрать(как иначе не знаю) свойства блока найти конкретные с известным именем и их обработать. но чтоб перебрать нужно знать сколько их.. а свойства как count у них кажется нет http://entercad.ru/acadauto.en/idh_d...rty_object.htm как быть? ----- добавлено через ~3 ч. ----- пару минут подумав решил проблему с помощью for each Последний раз редактировалось Simson, 11.03.2018 в 21:04. |
|||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
готово! и вправду код стал в разы меньше! без костылей в виде извлечения данных и всех компромиссов ради этого костыля! все стало куда проще! огромное спасибо!
----- добавлено через 44 сек. ----- не знаю что такое отладчик.. хотите сказать он возвращает количество? |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
ну да.. а можно было бы тоже самое увидеть через отладчик после выполнения строки с GetDynamicBlockProperties
----- добавлено через ~1 мин. ----- если не нужно заранее знать количество (например, для выделения памяти под массив) - то можно и через for each |
|||
![]() |
|
||||
Код:
__________________
Мастерская СПДС |
||||
![]() |
|
||||
Регистрация: 08.03.2018
Сообщений: 45
|
да подучить безусловно стоит. спасибо
пс: мои блоки мне нравятся больше.. но тут уж дело индивидуальное.. подскажите через перебор или через выборку обекты ищутся только в этом чертеже или все подгруженные ссылки тоже участвуют? ----- добавлено через ~7 мин. ----- Цитата:
On Error Resume Next |
|||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616
|
Может быть Вы сами посмотрите в справке по VBA (именно VBA, так как это ни коем образом не касается автокада) на разделы посвященные конструкции On Error и объекту Err, внимательно прочитаете сообщение откуда код выдрали, сами разберетесь и сами ответите на свой вопрос?
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Слой и стили. Их создание, установка текущими, и возврат к исходному состоянию после завершения команды | Browning Zed | LISP | 7 | 23.02.2018 11:36 |
Очистка временных файлов после вызова команды Копировать в буфер | olga87 | LISP | 12 | 15.11.2017 12:45 |
Как настроить AutoCAD. Сохранение протокола командной строки после закрытия файла | auzerius | Программирование | 2 | 01.11.2015 17:25 |
Зависание системы после установки AutoCAD 2010 | Westroy | AutoCAD | 1 | 11.05.2010 15:27 |
Зарос в командной строке русского AutoCAD. | {Smirnoff} | AutoCAD | 4 | 12.01.2006 14:06 |