Новое в VetCAD++ 3.15
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

Simson вне форума Вставить имя

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

Код:
[Выделить все]
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.
Просмотров: 3668
 
Непрочитано 10.03.2018, 18:30
#2
trir


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


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


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


а как же?
Simson вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.03.2018, 19:39
#4
Сергей812


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


написать свое извлечение данных.. и на 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
Сообщений: 4,936


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


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


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


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


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


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

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

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

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


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

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

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


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


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


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


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

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


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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||