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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA Выбор блоков по имени

VBA Выбор блоков по имени

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 25.05.2017, 09:45 #1
VBA Выбор блоков по имени
ramber
 
Регистрация: 18.04.2011
Сообщений: 31

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

Добрый день!

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

Есть ли способ создать набор из всех блоков одного имени не прибегая к выбору чего-то с чертежа?
Просмотров: 1545
 
Непрочитано 25.05.2017, 10:18
#2
Кулик Алексей aka kpblc
Moderator

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


Можно. Проходишь по блоку текущего пространства и собираешь нужные тебе элементы.
Или, опять же, в SelectionSets есть, насколько я помню, нечто типа SelectAll - посмотри документацию.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 25.05.2017, 10:39
#3
ramber


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Или, опять же, в SelectionSets есть, насколько я помню, нечто типа SelectAll - посмотри документацию.
Получилось! Спасибо!

Можно узнать твой номер счета / карты, ты очень во много мне помог, хотелось бы поблагодарить чем-нибудь посущественнее "спасибо"
ramber вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.05.2017, 10:56
#4
Кулик Алексей aka kpblc
Moderator

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


Не выдумывай
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 11:57
#5
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,479


Товарищи, сто лет не программировал, подскажите.. Задачка - быстро убить все вхождения блока в файле. SelectBlock впихивает в набор все динблоки, если "varData(1) = "`*U*," & name_Blck", либо - если "varData(1) = "name_Blck" - не включает нужный динблок. Приходится перебирать и проверять по EffectiveName. Нет ли какого способа более грамотного - собрать все вхождения динблока в файле на корабль и разом утопить?
А еще - если не игнорить ошибки "On Error Resume Next", при удалении блоков вылазит




Код:
[Выделить все]
  
On Error Resume Next 
       Set varSelBl = SelectBlock()
        For Each tmpinsBl In varSelBl
         If tmpinsBl.EffectiveName = name_Blck Then
            tmpinsBl.Delete
         End If
        Next

Private Function SelectBlock() As AcadSelectionSet
Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Dim intType(1) As Integer
Dim varData(1) As Variant
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
 If objSelSet.Name = "block" Then
  objSelSet.Delete
  Exit For
 End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("block")
intType(0) = 0 '
varData(0) = "INSERT" '
intType(1) = 2 '
varData(1) = "`*U*," & name_Blck '
objSelSet.Select acSelectionSetAll, , , intType, varData
Set SelectBlock = objSelSet
End Function
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 89
Размер:	5.1 Кб
ID:	191865  
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 12:32
#6
Сергей812


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


В .Net без циклов тоже не обойтись )
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 14:17
#7
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,479


А подскажите, вот такая конструкция фильтра вроде работает, собирает в коллекцию таблицы из пространства модели.

Код:
[Выделить все]
Dim intType(1) As Integer
Dim varData(1) As Variant
intType(0) = 0 '
varData(0) = "ACAD_TABLE" '
intType(1) = 410
varData(1) = "Model"
А можно ли аналогично получить коллекцию из таблиц в пространстве листа (на всех листах, вместе взятых)?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 14:50
1 | #8
baksconstructor


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
А можно ли аналогично получить коллекцию из таблиц в пространстве листа (на всех листах, вместе взятых)?
Сделать список листов через запятую и подсунуть в строку
varData(1) = сюды
baksconstructor вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 14:58
#9
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,479


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Сделать список листов через запятую и подсунуть в строку
varData(1) = сюды
спасиб, попробую!

А не подскажите по этому коду:

Код:
[Выделить все]
Set varSelBl = SelectBlock()
        For Each tmpinsBl In varSelBl
         If tmpinsBl.EffectiveName = name_Blck Then
            tmpinsBl.Delete
         End If
        Next
поштучно расстреливаю членов коллекции, но - я так понимаю, если попытаться убить последнего члена, вылазит ошибка..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 15:04
#10
baksconstructor


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
если попытаться убить
Зачем ? удялете из чертежа ? Тогда лучше вырезать, насколько помню .erase
baksconstructor вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 15:57
#11
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,479


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Зачем ? удялете из чертежа ? Тогда лучше вырезать, насколько помню .erase
с еrase та же ошибка..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 15:59
#12
baksconstructor


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


или весь код или хотяб принтскрины дайте
baksconstructor вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 16:17
#13
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,479


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
или весь код или хотяб принтскрины дайте
как то так:

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

 Dim tmpvar, varSelBl As AcadSelectionSet, tmpinsBl As AcadEntity 'AcadBlockReference

 'On Error Resume Next
 name_Blck = "x123"
 returnReal = 1
 returnReal = ThisDrawing.Utility.GetReal("1 али 0?")

If returnReal = 0 Then
       Set varSelBl = SelectBlock()
        For Each tmpinsBl In varSelBl
         If tmpinsBl.EffectiveName = name_Blck Then
            tmpinsBl.Erase '.Delete
         End If
        Next
Else
 '****
End if
'****
End sub()


Private Function SelectBlock() As AcadSelectionSet
Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Dim intType(1) As Integer
Dim varData(1) As Variant
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
 If objSelSet.Name = "block" Then
  objSelSet.Delete
  Exit For
 End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("block")
intType(0) = 0 '
varData(0) = "INSERT" '
intType(1) = 2 '
varData(1) = "`*U*," & name_Blck ' 
objSelSet.Select acSelectionSetAll, , , intType, varData
Set SelectBlock = objSelSet
'Stop
End Function
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 18:03
#14
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,100
Отправить сообщение для maratovich с помощью Skype™


А как это вообще у вас работает ?

1.поставьте отдельно от всего (сверху)
Dim name_Blck as String

2. Проверил на 2013 , всё нормально обработало, никакой ошибки не выдало, удалило все боки.
Думаю что у вас в настройках не того... посмотрите принткрин, проверьте.
Миниатюры
Нажмите на изображение для увеличения
Название: настр.PNG
Просмотров: 7
Размер:	17.3 Кб
ID:	191889  
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 18:08
#15
Сергей812


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


Цитата:
Сообщение от maratovich Посмотреть сообщение
1.поставьте отдельно от всего (сверху)
Dim name_Blck as String
тогда уж напомнить об Option Explicit )
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 18:22
#16
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,479


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
тогда уж напомнить об Option Explicit )
Спасибо, да не, не в этом дело.. я просто избирательно скопировал, переменные все объявлены.. И если какой косяк с объявлением переменных, vba об этом скажет сразу, до начала исполнения модуля. А тут ругается за какое-то "нарушение блокировки"..

И галка на "err trap" стоит там же..

__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 18:31
#17
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,100
Отправить сообщение для maratovich с помощью Skype™


Вы сперва этот отдельный код проверьте (с форума), если оно работает, то значит в других строках проблема.
Или в другом файле, или переустановить vba....
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.08.2017, 18:48
1 | #18
Сергей812


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


AlexV, не вы первый с этой ошибкой на форуме)
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA Выбор блоков по имени

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 669 24.03.2017 20:16
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 12 10.09.2015 14:31
Массовое редактирование свойств атрибутов блоков kgb Программирование 5 22.06.2009 20:23
VBA: утечка памяти при вставке блоков Mikha Программирование 13 03.04.2009 09:18
как узнать сколько блоков в чертеже определенного имени? ilka_t AutoCAD 11 22.07.2005 10:57

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


Размещение рекламы