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

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

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

Ответ
Поиск в этой теме
Непрочитано 10.03.2018, 18:07
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.
Просмотров: 9302
 
Непрочитано 11.03.2018, 20:12
#41
Сергей812


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


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


Цитата:
Сообщение от 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,293
Отправить сообщение для 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,047


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


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


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


есть такая "страшная" вещь в 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,004


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


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


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


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


уже давал ссылку - пост 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,004


ну да.. а можно было бы тоже самое увидеть через отладчик после выполнения строки с 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,588


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,293
Отправить сообщение для 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 Кб, 13 просмотров)
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 12.03.2018, 11:28
#60
Сергей812


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


Маленькое уточнение:
Цитата:
Сообщение от Boxa Посмотреть сообщение
' Количество свойств
Dim countDynProp As Integer
countDynProp = UBound(dynProp)
индексация с нуля, поэтому еще единицу надо прибавить.
Сергей812 вне форума  
Ответ
Вернуться   Форум 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