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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vba, как посчитать количество блоков с помощью item и handle?

vba, как посчитать количество блоков с помощью item и handle?

Ответ
Поиск в этой теме
Непрочитано 10.03.2018, 18:07 #1
vba, как посчитать количество блоков с помощью item и handle?
Simson
 
Регистрация: 08.03.2018
Сообщений: 45

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

Код:
[Выделить все]
ThisDrawing.SendCommand ("-ДАННЫЕИЗВЛ" & vbCr & spath & dxe & ".dxe" & vbCr & "Да" & vbCr)
Теста ради написал такие строчки чтоб проверить как работает...

Код:
[Выделить все]
Private Sub AcadDocument_beginCommand(ByVal CommandName As String)
    If CommandName <> "-ДАННЫЕИЗВЛ" & vbCr Then
        Exit Sub
    End If
    MsgBox "hopla"
End Sub
в итоге условие распознания команды вовсе не реагирует.. не видит он эту команду. пробовал и vbcr добавлять- никак..
как это можно исправить?
и может есть идеи реализовать это проще? может внутри процедуры можно все такие задать условие при котором код продолжиться только после завершения команды?

Последний раз редактировалось Simson, 10.03.2018 в 22:09.
Просмотров: 10079
 
Непрочитано 10.03.2018, 18:30
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


всё делается не так...
trir вне форума  
 
Автор темы   Непрочитано 10.03.2018, 19:11
#3
Simson


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


а как же?
Simson вне форума  
 
Непрочитано 10.03.2018, 19:39
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


написать свое извлечение данных.. и на VBA это реализуется

----- добавлено через ~12 мин. -----
например, перебором thisdrawing.modelspace.items либо используя фильтры в наборах, если нужно определенные примитивы. Это будет работать гораздо надежнее, чем ваше решение.
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.03.2018, 19:55
#5
Simson


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


я пробовал элементарно количество блоков посчитать через blocks("name").count и он выдавал 1
а в вашем случае в item что вводить?
мне нужны параметры динамических блоков
Simson вне форума  
 
Непрочитано 10.03.2018, 20:07
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
а в вашем случае в item что вводить?
индекс, от 0 до ThisDrawing.ModelSpace.Сount - 1. Почитайте инет, примеров там полно)
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.03.2018, 20:14
#7
Simson


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


очень плохо гуглится про autocad vba... как узнать вообще какая цифра принадлежит нужному объекту?
Simson вне форума  
 
Непрочитано 10.03.2018, 20:21
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


прекрасно все гуглится, если хотеть. Про идентификацию конкретных объектов - см. Handle и функцию HandleToObject
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.03.2018, 20:22
#9
Simson


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


спасибо

----- добавлено через ~1 ч. -----
почему количество блоков выдает рандомное число? у меня 8 копий одного блока выдает 5! другого и того больше а выдает 2!
Simson вне форума  
 
Непрочитано 10.03.2018, 21:52
#10
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


какой алгоритм в коде реализовали - такое число и получили) Приводите пример кода и файла, если хотите получить определенный ответ. И переименуйте тему тогда, указав - на каком языке пишете и что хотите реализовать. Модераторы потом все равно попросят это сделать)
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.03.2018, 22:01
#11
Simson


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


Код:
[Выделить все]
Sub pp()
    Dim i%, t%
    For i = 0 To ThisDrawing.ModelSpace.Count - 1
        If ThisDrawing.Blocks.Item(i).Name = "Òðóáà" Then
            t = i
        End If
    Next
    
    MsgBox ThisDrawing.Blocks.Item(t).Count

End Sub
вот так реализовал.. без ФАЙЛА НАВЕРНОЕ причина будет ясна ибо не уверен что такая тактика рабочая.. в файле просто копия блока одного и того же..

----- добавлено через ~2 мин. -----
что то очень мутное с handle и handletoobject.. нигде нет толковой инфы или я как то плохо гуглю.. и раньше натыкался на эти темы но не мог разъяснения найти..
точно такой метод позволит мне вообще вытащить количество блоков полилиний ( и длину их), и параметры дин блоков?
Simson вне форума  
 
Непрочитано 10.03.2018, 22:37
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
ThisDrawing.Blocks.Item(t).Count
blocks - это определения блоков, а не их вставки. Разницу между определением блока и его вставкой понимаете хоть?
Поэтому весь ваш код внутри тела цикла считает все что угодно, кроме количество блоков в чертеже.
=======================================================
1. Получаете примитив из коллекции ThisDrawing.ModelSpace.Item(i)
2. Проверяете - является ли он вставкой блока. И если является - то начинаете обрабатывать его как вставку блока. Иначе пропускаете.

----- добавлено через 42 сек. -----
а про Handle забудьте пока, для данной задачи он не нужен скорее всего.
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.03.2018, 22:54
#13
Simson


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


нет не особо понимаю..
в теле цикла не считалось ничего в теле цикла лишь находился индекс соответствующий моему блоку.. ну я так думал.. но не суть
как проверить является ли примитив вставкой блока?
Simson вне форума  
 
Непрочитано 10.03.2018, 23:02
#14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
нет не особо понимаю..
прежде чем автоматизировать - надо разобраться в том, что собираетесь автоматизировать.
Тогда может не будете в цикле по коллекции примитивов пространства модели обращаться с переменной этого цикла к элементу коллекции определений блоков. Удивительно, что ошибку не выдало во время исполнения - наверно, чертеж сам пустой еще фактически и не вышли за пределы коллекции определений блоков.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Simson Посмотреть сообщение
как проверить является ли примитив вставкой блока?
использовать TypeOf, например.
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.03.2018, 23:15
#15
Simson


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


спасибо
буду разбираться

----- добавлено через ~15 мин. -----
Код:
[Выделить все]
Sub pp()
    Dim i%, t%
    For i = 0 To ThisDrawing.ModelSpace.Count - 1
        If TypeOf ThisDrawing.ModelSpace.Item(i) Is AcadBlockReference Then
            t = t + 1
        End If
    Next
    
    MsgBox t

End Sub
так верно? выдает 23 а у меня 12

----- добавлено через ~16 мин. -----
аа все верно. он же все блоки посчитал...
идем дальше
спасибо большое за информацию.. есть что почитать теперь)

----- добавлено через ~26 мин. -----
тоже самое с AcadPolyline не работает(
и как работать с конкретным блоком(как его имя задействовать)? и его параметрами?
Simson вне форума  
 
Непрочитано 11.03.2018, 00:01
#16
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


у конкретной вставки блока нет имени, есть ObjectID и есть Handle. Первое формируется на лету при открытии чертежа *.dwg, второе остается неизменным во всех сессиях открытия чертежа. А вообще, если делаете приблуду для КЖ - поищите на форуме, люди уже выкладывали наработки.

----- добавлено через 32 сек. -----
ну или обрабатывайте непосредственно в цикле

----- добавлено через ~9 мин. -----
и переменная i должна быть long, а не Integer. Так как Count тоже long
Сергей812 вне форума  
 
Непрочитано 11.03.2018, 06:46
#17
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
у конкретной вставки блока нет имени

или под именем имелось ввиду что то другое?

Simson, Вы в хелп и документацию принципиально не смотрите? Более подробного хелпа еще поискать нужно, есть примеры по каждому методу и на каждый чих. Фактически можно брать примеры целыми кусками и лепить из них свою поделку.
Boxa вне форума  
 
Непрочитано 11.03.2018, 09:40
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Boxa Посмотреть сообщение
или под именем имелось ввиду что то другое?
Цитата:
Сообщение от Simson Посмотреть сообщение
и как работать с конкретным блоком(как его имя задействовать)? и его параметрами?
параметры определения блока обычно особой смысловой информации не несут, поэтому речь скорее всего идет именно о вставке блока. Конкретную вставку блока по имени его определения определить не получиться (если только в чертеже не используется исключительно по одной вставке блоке на каждое определение и не используются динамические блоки). Поэтому здесь уже надо оперировать теми же хэндлами примитивов. Хотя если ему нужно написать лишь аналог извлечения данных, то надо просто обрабатывать прямо в цикле примитивы в зависимости от их типа.
Сергей812 вне форума  
 
Непрочитано 11.03.2018, 09:54
#19
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


http://forum.dwg.ru/showthread.php?p...5&#post1713835
trir вне форума  
 
Непрочитано 11.03.2018, 10:17
#20
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


trir, так то ж не на VBA...
Да и судя по сообщениям автора, он не только с блоками работает, но полилинии обрабатывает, а может и другие объекты
Boxa вне форума  
 
Непрочитано 11.03.2018, 10:25
#21
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
Дело в том что макрос вбивает команду извлечения данных в командную строку а потом работает с извлеченными данными.
Т.е. на извлечении самих данных работа не заканчивается.
Сергей812 вне форума  
 
Непрочитано 11.03.2018, 12:25
#22
Кулик Алексей aka kpblc
Moderator

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


Т.е. проще сделать собственный вариант "извлечения" - во избежание, как говорится
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.03.2018, 12:33
#23
Simson


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


Да не только блоки. есть несколько определений блока(динамических) и множественное количество их вставок. в принципе да нужен аналог извлечения данных, т е длины и количества конкретных полилиний( пот типу линии например отобрать) количество вставок блока каждого определения и для каждой вставки их динамические параметры. вот такая простая задача.

----- добавлено через ~4 мин. -----
почему же не vba? на vba не реализуемо? казалось бы базовая задача почему так неочевидно выполняется.. странно странно
Simson вне форума  
 
Непрочитано 11.03.2018, 12:43
#24
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


реализуемо, люди и на лиспе реализуют подобную обработку) Просто VBA в плане обработки информации достаточно урезанный язык, придется писать всякие костыли, использовать внешние словари или реализовывать их программно.
Сергей812 вне форума  
 
Непрочитано 11.03.2018, 12:59
#25
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Simson Посмотреть сообщение
Да не только блоки. есть несколько определений блока(динамических) и множественное количество их вставок. в принципе да нужен аналог извлечения данных, т е длины и количества конкретных полилиний( пот типу линии например отобрать) количество вставок блока каждого определения и для каждой вставки их динамические параметры. вот такая простая задача.
и решение простое, селсетом делаешь выборку динамических блоков по нужному пространству, можно добавить еще условия выборки слой, цвет и прочее.
потом по EffectiveName в цикле отбираешь, только блоки с нужным именем, если это нужный блок в этом же цикле выдергиваешь из него нужные данные, и закидываешь их например в массив
потом работаешь только с массивом.
с полилинией аналогично.
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 11.03.2018, 13:00
#26
Simson


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


а без выделения? через итем перебрав не выдернуть нужную инфу?
Simson вне форума  
 
Непрочитано 11.03.2018, 13:09
| 1 #27
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Цитата:
Сообщение от Simson Посмотреть сообщение
Да не только блоки. есть несколько определений блока(динамических) и множественное количество их вставок. в принципе да нужен аналог извлечения данных, т е длины и количества конкретных полилиний( пот типу линии например отобрать) количество вставок блока каждого определения и для каждой вставки их динамические параметры. вот такая простая задача.
Да, простая задача. Описали Вы ее очень сумбурно, если так же писать код - будет беда.
В остальном, данная задача решается компоновкой примеров, которые есть в справке.
Boxa вне форума  
 
Непрочитано 11.03.2018, 13:11
#28
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Simson Посмотреть сообщение
а без выделения?
при чем тут выделение... http://vbamodel.narod.ru/AutoCAD/idh...set_object.htm
http://vbamodel.narod.ru/AutoCAD/idh_select.htm
задавай фильтры, и обрабатывай выборку, как тебе заблогарассудится, но да дин блок по имени выбрать не получится, обычный легко. Зато можно сделать выборку блоков только с атрибутами, по слою или слоям, с модели или только листов с любого листа или еще как.. и не перебирать тупо в цикле все блоки пространства.
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 11.03.2018, 13:22
#29
Simson


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Да, простая задача. Описали Вы ее очень сумбурно, если так же писать код - будет беда.
В остальном, данная задача решается компоновкой примеров, которые есть в справке.
справкой видимо я тоде не научился полноцеено пользоваться если подскажете что то полезное в этом направлении будет здоорово

----- добавлено через 53 сек. -----
Всем спасибо за наводки буду пробовать
Simson вне форума  
 
Непрочитано 11.03.2018, 14:23
#30
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


все равно с первого раза не получиться конечный вариант) Сначала будете выгребать всякие логические ошибки, потом в процессе работы всплывают какие то рабочие нюансы и снова переделывать. С фильтрами наборов будет быстрее работать, с циклом проще в понимании на первое время. Всегда можно переписать код, используя фрагменты уже отлаженного кода из предыдущих версий)
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.03.2018, 15:47
#31
Simson


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


это дело понятное. я начал как раз с перебора и осознания всяких методов и свойств дин блоков
что то получается.. количество и имена я все таки изъял
а вот со свойствами загвоздка.
как задать переменную чтоб ей присвоить свойство дин блока?
так не работает:
Код:
[Выделить все]
Dim blk As Object
blk = blo.GetDynamicBlockProperties

Последний раз редактировалось Simson, 11.03.2018 в 15:52.
Simson вне форума  
 
Непрочитано 11.03.2018, 16:08
#32
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


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

----- добавлено через ~1 мин. -----
ЧТО ДОЛЖНО БЫТЬ НА ВЫХОДЕ!
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 11.03.2018, 16:15
#33
Simson


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


может таких велосипедов и полно но пока не наткнулся ни на один.. плохо ищу? возможно..
суть как и говорилось проста.. есть автокад с кучей блоков раскиданных по всему чертежу(благо в одном определенном заранее известном слое) нужно чтоб после изменения и сохранения начинался макрос( с этим я справился), который заключается в следующем:
считать все дин параметры блоков их имена и их количества, и количество и длины определенных полилиний.. и всю эту инфу выбросить в ексель.. а там есть классная табличка которая все что нужно посчитает..
сейчас задача стоит собственно лишь в считывании информации из автокада.. все что до и после уже работает

----- добавлено через ~3 мин. -----
на выходе при сохранении автокада в экселе готовые расчитанные данные

----- добавлено через ~5 мин. -----
я это сделал через коммнадную строку встроенной функцией извлечения.. но она выполнялась после кода.. поэтому нужно было сохранить дважды чтоб работало..

Последний раз редактировалось Simson, 11.03.2018 в 17:08.
Simson вне форума  
 
Непрочитано 11.03.2018, 19:00
| 1 #34
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


вот из экселя и стучались бы в акад через позднее связывание. Через SelectionSet и фильтры сграбливаете информацию из акада и сразу заполняете свою "хитрую" табличку.
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.03.2018, 19:50
#35
Simson


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


да я вот как раз сейчас разгребаю в этом направлении..
до этого казалось такое извлечение единственный выход..
застрял на моменте когда присваиваю переменной свойства дин блока. вот здесь ошибку выдает
Код:
[Выделить все]
Dim blk As Object
blk = blo.GetDynamicBlockProperties
как исправить?

----- добавлено через ~2 мин. -----
а я из экселя могу достучаться до событий автокада? как же макрос будет запускаться?
Simson вне форума  
 
Непрочитано 11.03.2018, 19:58
#36
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Simson Посмотреть сообщение
а я из экселя могу достучаться до событий автокада? как же макрос будет запускаться?
если не будешь пользовать командные методы, тебе события ... не уперлись.. а для такой простой задачи, как в вебеа извлечь данные из блоков, разобрать их и выплюнуть например в таблицу того жэж автокад.. даже эксель не нужен.. блокнот и расширение файла vbs
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 11.03.2018, 20:03
#37
Simson


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


ну допустим я не использую командные методы. но автокад это такая подвижная субстанция.. все время что то меняется.. поэтому хотелось бы что это автоматически все подгружалось в случае изменения... зря я что ли это пишу? чтоб кнопку запуска макроса самому тыкать каждый раз?
Simson вне форума  
 
Непрочитано 11.03.2018, 20:06
#38
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Simson Посмотреть сообщение
хотелось бы что это автоматически все подгружалось в случае изменения... зря я что ли это пишу? чтоб кнопку запуска макроса самому тыкать каждый раз?
есть такое решение, но рад не будешь, лучше получать отчеты когда все готово... иначе тормоза жестокие неминуемые.

----- добавлено через ~2 мин. -----
даже автодеск это не пользует в своих вертикалках (а они то в курсе).. параметризация и дин блоки с табицами параметров.... это такое г...
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 11.03.2018, 20:08
#39
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
как исправить?
читать справку. И смотреть не только на аргументы, но и на тип возвращаемого значения.
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.03.2018, 20:09
#40
Simson


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


так кнопку сохранения и тыкают обычно когда все готово.. если раз в день будет макрос запускаться то не страшно думаю)

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И смотреть не только на аргументы, но и на тип возвращаемого значения.
подробнее не скажете? секрет?
Simson вне форума  
 
Непрочитано 11.03.2018, 20:12
#41
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
ну допустим я не использую командные методы. но автокад это такая подвижная субстанция.. все время что то меняется.. поэтому хотелось бы что это автоматически все подгружалось в случае изменения... зря я что ли это пишу? чтоб кнопку запуска макроса самому тыкать каждый раз?
тогда добро пожаловать в Net Api / ObjectARX - там еще можно как-то в реальном времени реагирующую систему сделать)
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.03.2018, 20:13
#42
Simson


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


нужен массив?
Simson вне форума  
 
Непрочитано 11.03.2018, 20:14
#43
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
подробнее не скажете? секрет?
не секрет - variant, а не объект. Но вы так и не научитесь пользоваться справкой, если каждую ерунду, которая гуглится за минуту - будете тут спрашивать)
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.03.2018, 20:14
#44
Simson


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


нет нет. в реальном времени не надо.. я ж все завязал на кнопке сохранения в автокаде.. этого достаточно

----- добавлено через ~1 мин. -----
так я это и не сам придумал.. я нашел пордобные строчки даже с подписанным комментарием" ура спасибо работает"
а про справку.. как пользоваться ей правильно?
Simson вне форума  
 
Непрочитано 11.03.2018, 20:15
#45
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от Simson Посмотреть сообщение
подробнее не скажете? секрет?
лихко
http://www.autodesk.ru/adsk/servlet/...&siteID=123112
куда уж подробнее

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Simson Посмотреть сообщение
как пользоваться ей правильно?
для начала прочитать и попытаться понять написанное
__________________
Мастерская СПДС
doctorraz вне форума  
 
Автор темы   Непрочитано 11.03.2018, 20:25
#46
Simson


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


ну я нажимаю ф1.. но это же огого сколько всего.. откуда мне знать куда конкретно мне надо?
Simson вне форума  
 
Непрочитано 11.03.2018, 20:26
#47
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


начинай отсюда
trir вне форума  
 
Непрочитано 11.03.2018, 20:26
#48
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Simson Посмотреть сообщение
так я это и не сам придумал.. я нашел пордобные строчки даже с подписанным комментарием" ура спасибо работает"
на заборах тоже много чего пишут) Лучше всегда с первоисточниками сверятся
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.03.2018, 20:28
#49
Simson


 
Регистрация: 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.
Simson вне форума  
 
Непрочитано 11.03.2018, 23:54
#50
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


есть такая "страшная" вещь в VBA, как отладчик. Если бы посмотрели там - что возвращает GetDynamicBlockProperties, то и вопросов бы с количеством не возникло.
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.03.2018, 23:59
#51
Simson


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


готово! и вправду код стал в разы меньше! без костылей в виде извлечения данных и всех компромиссов ради этого костыля! все стало куда проще! огромное спасибо!

----- добавлено через 44 сек. -----
не знаю что такое отладчик.. хотите сказать он возвращает количество?
Simson вне форума  
 
Непрочитано 12.03.2018, 00:02
#52
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


он позволяет поставить точки остановки в коде и посмотреть реальные значения переменных в данный момент - очень полезно для понимая, что и как работает
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.03.2018, 00:04
#53
Simson


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


спасибо попробую. спойлернете? что возвращает тот метод?
Simson вне форума  
 
Непрочитано 12.03.2018, 00:06
#54
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


уже давал ссылку - пост 48.
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.03.2018, 00:08
#55
Simson


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


это массив!

----- добавлено через 35 сек. -----
т е можно было через размерность массива?

----- добавлено через ~1 мин. -----
но через for each думаю компактнее вышло
Simson вне форума  
 
Непрочитано 12.03.2018, 00:10
#56
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


ну да.. а можно было бы тоже самое увидеть через отладчик после выполнения строки с GetDynamicBlockProperties

----- добавлено через ~1 мин. -----
если не нужно заранее знать количество (например, для выделения памяти под массив) - то можно и через for each
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.03.2018, 00:12
#57
Simson


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


пусть будет универсально... вдруг в блоки еще добавлю что то

----- добавлено через ~1 мин. -----
спасибо еще раз. понабрался полезностей) я просто только только начал это все открывать для себя.. поэтому все ново
Simson вне форума  
 
Непрочитано 12.03.2018, 07:51
#58
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Simson, нда.. Вам бы еще сам VBA подучить нужно, а не только объектную модель автокада...
Я на VBA давно не пишу, но для Вас набросал из примеров маленький фрагмент кода, возможно он будет Вам полезен.
Код:
[Выделить все]
Sub Example_GetEntity()
   
    ' Begin the selection
    Dim returnObj As AcadObject
    Dim basePnt As Variant
    
    On Error Resume Next
    
    ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object"
    
    If Err <> 0 Then
        Err.Clear
        MsgBox "Program ended.", , "GetEntity Example"
        Exit Sub
    End If


    If TypeOf returnObj Is AcadBlockReference Then
        Dim block As AcadBlockReference
        Set block = returnObj
        'проверяем динамичный ли блок
        If block.IsDynamicBlock Then
            'Получаем массив дин. свойств
            Dim dynProp As Variant
            dynProp = block.GetDynamicBlockProperties
            ' Количество свойств
            Dim countDynProp As Integer
            countDynProp = UBound(dynProp)
        End If
        
    ElseIf TypeOf returnObj Is IAcadLWPolyline Then
        Dim pline As IAcadLWPolyline
        Set pline = returnObj
        'и далее по тексту
    
    End If
    
End Sub
Boxa вне форума  
 
Непрочитано 12.03.2018, 09:46
#59
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,299
Отправить сообщение для doctorraz с помощью Skype™



Код:
[Выделить все]
Sub FinderBlock()

Dim intType(10)  As Integer
Dim varDat(10)   As Variant
Dim objSelSet   As Object ' AcadSelectionSet

    intType(0) = -4
    varDat(0) = "<OR"
    intType(1) = 8 'слой
    varDat(1) = "Слой1"
    intType(2) = 8 'слой
    varDat(2) = "Слой2"
    intType(3) = 8 'слой
    varDat(3) = "Слой3"
    intType(4) = -4
    varDat(4) = "OR>"
    
    intType(5) = 0
    varDat(5) = "INSERT" ' вставленный блок
    
    intType(6) = -4
    varDat(6) = "<OR"
    intType(7) = 410
    varDat(7) = "Model"
    intType(8) = 410
    varDat(8) = "Лист1"
    intType(9) = -4
    varDat(9) = "OR>"
    intType(10) = 66 '\
    varDat(10) = 1   '/ блоки с атрибутами

    Set objSelSet = vbdPowerSet("seTEST")
    objSelSet.Select 5, , , intType, varDat ' Ищем

Debug.Print "Найдено блоков с атрибутами - " & objSelSet.Count

    If objSelSet.Count = 0 Then ' блоков нет
        MsgBox "Ничего не найдено", vbSystemModal + vbInformation ', App.Title
        Exit Sub
    End If
    
    For Each blkref In objSelSet 'прогоняем в цикле блоки проверяем имена, свойства
        If blkref.EffectiveName Like "*DKC*" Or blkref.EffectiveName Like "*РЗКК*" Then
            varAttributes = blkref.GetAttributes
            For i = LBound(varAttributes) To UBound(varAttributes)
                Set prop = varAttributes(i)
                Debug.Print "Название атрибута- " & prop.TagString & " **** Значение атрибута - " & prop.TextString
            Next i
        End If
    Next



End Sub


Public Function vbdPowerSet(strName As String) As Object 'AcadSelectionSet
    Dim objSelSet As Object ' AcadSelectionSet
    Dim objSelCol As Object ' AcadSelectionSets
100     Set objSelCol = ThisDrawing.SelectionSets
110     For Each objSelSet In objSelCol
120         If objSelSet.Name = strName Then
130             objSelSet.Delete
                Exit For
            End If
        Next
140     Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
150     Set vbdPowerSet = objSelSet
End Function
Вложения
Тип файла: zip Пример блоки.zip (109.4 Кб, 15 просмотров)
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 12.03.2018, 11:28
#60
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Маленькое уточнение:
Цитата:
Сообщение от Boxa Посмотреть сообщение
' Количество свойств
Dim countDynProp As Integer
countDynProp = UBound(dynProp)
индексация с нуля, поэтому еще единицу надо прибавить.
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.03.2018, 21:37
#61
Simson


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


да подучить безусловно стоит. спасибо
пс: мои блоки мне нравятся больше.. но тут уж дело индивидуальное..
подскажите через перебор или через выборку обекты ищутся только в этом чертеже или все подгруженные ссылки тоже участвуют?

----- добавлено через ~7 мин. -----
Цитата:
Сообщение от Boxa Посмотреть сообщение
On Error Resume Next

ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object"

If Err <> 0 Then
Err.Clear
я ошибаюсь или в даннос случае не надо обнулять ошибку ибо эта строчка сама обнуляет ошибку?
On Error Resume Next
Simson вне форума  
 
Непрочитано 13.03.2018, 06:36
#62
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Цитата:
Сообщение от Simson Посмотреть сообщение
я ошибаюсь или в даннос случае не надо обнулять ошибку ибо эта строчка сама обнуляет ошибку?
On Error Resume Next
Может быть Вы сами посмотрите в справке по VBA (именно VBA, так как это ни коем образом не касается автокада) на разделы посвященные конструкции On Error и объекту Err, внимательно прочитаете сообщение откуда код выдрали, сами разберетесь и сами ответите на свой вопрос?
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > vba, как посчитать количество блоков с помощью item и handle?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слой и стили. Их создание, установка текущими, и возврат к исходному состоянию после завершения команды 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