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

Вернуться   Форум 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.
Просмотров: 9301
 
Непрочитано 10.03.2018, 18:30
#2
trir


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


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


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


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


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


написать свое извлечение данных.. и на 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,004


Цитата:
Сообщение от 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,004


прекрасно все гуглится, если хотеть. Про идентификацию конкретных объектов - см. 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,004


какой алгоритм в коде реализовали - такое число и получили) Приводите пример кода и файла, если хотите получить определенный ответ. И переименуйте тему тогда, указав - на каком языке пишете и что хотите реализовать. Модераторы потом все равно попросят это сделать)
Сергей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,004


Цитата:
Сообщение от 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,004


Цитата:
Сообщение от 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,004


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

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

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

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


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

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

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


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


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


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


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

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


trir, так то ж не на VBA...
Да и судя по сообщениям автора, он не только с блоками работает, но полилинии обрабатывает, а может и другие объекты
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