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

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

VBA программно удалить все элементы на слове

Ответ
Поиск в этой теме
Непрочитано 15.12.2015, 22:07 #1
VBA программно удалить все элементы на слове
kefirrr
 
Регистрация: 29.12.2014
Сообщений: 28

Добрый день!
Попробую вкратце описать суть проблемы.
У меня есть чертеж, на котором очень много элементов (более 25000 ), есть слой, к примеру, "trace", где я вырисовываю необходимые мне примитивы. Но перед тем, как заново нарисовать в этом слое нужную линию, мне нужно стереть все предыдущие.

Что я делала. Я методом перебора, проверяла лежит ли данный элемент в этом слое, и если лежал- то удаляла его. Все работает, НО!!! при таком количестве элементов по времени это занимает чуть- ли не секунд 30. ЭТО ОЧЕНЬ ДОЛГО. Хочется сократить время работы макроса.

Умом я понимаю, что нужно каким-то иным способом удалить все элементы, лежащие на данном слое, но как. Так же появилась идея удалить полностью слой, а затем его заново создавать. Но есть ли в этом смысл.

Идеи, желательно на VBA выдавать. Спасибо
Просмотров: 5365
 
Непрочитано 15.12.2015, 22:11
#2
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от kefirrr Посмотреть сообщение
VBA программно удалить все элементы на слове
Где-где?
Если не надо проходить по описаниям блоков, то см. методы и фильтры создания SelectionSet - там всего очень много можно нафильтровать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.12.2015, 23:16
#3
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Есть подозрение, что дело не в алгоритме, а в версии и разрядности. Чуть подробнее например тут http://adn-cis.org/autocad,-vba-i-proizvoditelnost.html
art_rrc вне форума  
 
Непрочитано 16.12.2015, 05:41
#4
Владимир_М


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


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

Идеи, желательно на VBA выдавать.
Но есть ли в этом смысл? применять программирование там, где все уже запрограммировано? Слои, вообще-то, для того примерно и придуманы... в диспетчере слоев все уже все придумано... до нас.
Выделяете все слои, кроме своего текущего (есть там специальная такая строка меню). Одним кликом блокируете все выделенные. Переходите в чертеж, выделяете все что осталось, а осталось именно только то, что на вашем слое (можно cntrl+A), и delete.

Последний раз редактировалось Владимир_М, 16.12.2015 в 06:05.
Владимир_М вне форума  
 
Непрочитано 16.12.2015, 06:44
#5
trir


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


просто это VBA
trir вне форума  
 
Непрочитано 16.12.2015, 08:00
#6
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Код:
[Выделить все]
 ;###################################
; Удаление всех объектов на текущем слое LISP
;###################################
(defun C:DELA_LAY  ( / S SSS)
	(setq SSS nil)
	(setq S (list (cons 8 (getvar "CLAYER"))))
	(setq SSS (ssget "x" S))
	(command "_ERASE" SSS "")
(princ)
 )
----- добавлено через ~21 мин. -----
Код:
[Выделить все]
'#######################
' VBA 
'######################
Sub SelectLAY()
  Dim sset As AcadSelectionSet
  Dim gpCode(0) As Integer
  Dim dataValue(0) As Variant
  Dim groupCode As Variant, dataCode As Variant

    ' отбор по группе (8) слой, название слоя ("AAAA") 
    gpCode(0) = 62: dataValue(0) = "AAAA"
    ' Методу будут передаваться переменные типа вариант, ссылающиеся на массивы
    groupCode = gpCode: dataCode = dataValue
    ' Собственно отбор по слою
    sset.Select acSelectionSetAll, , , groupCode, dataCode    sset.Erase

sset.Erase    
sset.Clear
sset.Delete

End SUb

----- добавлено через ~21 мин. -----
'#######################
' VBA 
'######################
Sub SelectLAY()
  Dim sset As AcadSelectionSet
  Dim gpCode(0) As Integer
  Dim dataValue(0) As Variant
  Dim groupCode As Variant, dataCode As Variant

    ' отбор по группе (8) слой, название слоя ("AAAA") 
    gpCode(0) = 62: dataValue(0) = "AAAA"
    ' Методу будут передаваться переменные типа вариант, ссылающиеся на массивы
    groupCode = gpCode: dataCode = dataValue
    ' Собственно отбор по слою
    sset.Select acSelectionSetAll, , , groupCode, dataCode    sset.Erase

sset.Erase    
sset.Clear
sset.Delete

End SUb

Последний раз редактировалось Кулик Алексей aka kpblc, 16.12.2015 в 21:09.
Puroshev вне форума  
 
Автор темы   Непрочитано 16.12.2015, 09:17
#7
kefirrr


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


Puroshev, спасибо! Как раз то, что искала
Кулик Алексей,
kefirrr вне форума  
 
Автор темы   Непрочитано 17.12.2015, 13:35
#8
kefirrr


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


Я пытаюсь оптимизировать данный код для управления autocad через Excell, но у меня функция спотыкается о строчку
Цитата:
sset.Select acSelectionSetAll, , , groupCode, dataCode sset.Erase
Что может быть не так?
kefirrr вне форума  
 
Непрочитано 17.12.2015, 14:00
#9
Boxa

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


kefirrr, а Вы сигнатуру метода в справке посмотрите и тогда будет очевидно, что sset.Erase в этой строке не место и зачем его 2 раза вызывают, так же вопрос.
Boxa на форуме  
 
Непрочитано 17.12.2015, 14:01
#10
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от kefirrr Посмотреть сообщение
Что может быть не так?
Отсутствие желания.
(sset.Erase удалите из этой строки)
art_rrc вне форума  
 
Автор темы   Непрочитано 17.12.2015, 14:28
#11
kefirrr


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


Зачем же так грубо.
Вот мой код в экселе
Код:
[Выделить все]
   sub LAYER()
Set ACADApp = GetObject(, "AutoCAD.Application")
  Set objDoc = ACADApp.ActiveDocument
  AppActivate ACADApp.Caption
    Application.DisplayAlerts = False '
    
    On Error Resume Next
    Set ACADApp = GetObject(, "AutoCAD.Application")
    On Error GoTo 0
    
    On Error Resume Next
    Set AcadDoc = ACADApp.ActiveDocument
    On Error GoTo 0
    
    If AcadDoc Is Nothing Then
        Set AcadDoc = ACADApp.Documents.Add
        ACADApp.Visible = True
    End If
'----------------------------------------
Dim objSS As Variant
Dim acSelectionSetAll As Variant
Dim Layer As Object
Dim a1 As Object
Dim intCodes(0) As Integer
Dim varCodeValues(0) As Variant
Dim strName As String
Dim aa As Variant
On Error GoTo Done
strName = "trace" '.GetString(True, vbCr & "Layer name to filter: ")
intCodes(0) = 0
varCodeValues(0) = strName
Set objSS = AcadDoc.SelectionSets.Add("PROBA22") '' set the code for layer
Debug.Print

objSS.Select acSelectionSetAll, , , intCodes, varCodeValues
objSS.Erase '.GetString False, vbLf & "Enter to continue "
Done:
If Not objSS Is Nothing Then
objSS.Delete
End If
End Sub
Программа спотыкается и не выполняет
Строку
Код:
[Выделить все]
objSS.Select acSelectionSetAll, , , intCodes, varCodeValues

Так же экспериментировала и со строчкой
[codeintCodes(0) = 0[/code]
Но на суть дела это не влияет ( на всякий случай написала, чтобы не придирались)

Последний раз редактировалось Кулик Алексей aka kpblc, 17.12.2015 в 19:54.
kefirrr вне форума  
 
Непрочитано 17.12.2015, 15:11
#12
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Для слоя intCodes(0) = 8
(остальное не смотрел)
art_rrc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA программно удалить все элементы на слове

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в автокаде выделить разом все одинаковые элементы и одним махом их удалить, чтобы по отдельности не удалять Dimmitriy AutoCAD 30 19.01.2013 17:54
Команда PURGE, или как удалить действительно ненужные неиспользуемые элементы из файла AlphaGeo Программирование 45 15.06.2009 15:14
Как программно удалить неиспользуемые стили мультивыносок. Makswell Программирование 6 08.04.2009 13:43
Программно в Vlisp удалить пустые растры elena_k LISP 9 12.12.2008 14:21
Как программно удалить Стиль Текста Led AutoCAD 2 12.01.2004 14:35