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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AcadSelectionSet. Выбор одного примитива из VB по типу (ssget "_:S")

AcadSelectionSet. Выбор одного примитива из VB по типу (ssget "_:S")

Ответ
Поиск в этой теме
Непрочитано 14.02.2012, 14:30 #1
AcadSelectionSet. Выбор одного примитива из VB по типу (ssget "_:S")
Дмитрий Асташев
 
päällikön suunnittelijat
 
Pietari, Venäjä
Регистрация: 04.12.2010
Сообщений: 63

Добрый день, коллеги!
Кто знает, как получить AcadSelectionSet с ЕДИНСТВЕННЫМ - первым выбранным объектом.
В лиспе это (ssget "_:S")
Вариант, использующий SendCommand не предлагать.
Просмотров: 3933
 
Непрочитано 14.02.2012, 15:04
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Utils.GetEntity
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 14.02.2012, 16:26
#3
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63




Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Utils.GetEntity
Спасибо! Получается. Преобразование к AcadSelectionSet показываю:

Dim SelectionSet As AcadSelectionSet
Try
SelectionSet = doc.SelectionSets.Add("SS")
Catch ex As Exception
doc.SelectionSets.Item("SS").Delete()
SelectionSet = doc.SelectionSets.Add("SS")
End Try
Dim returnObj As AcadObject
Dim ssobjs(0) As AcadEntity
Dim basePnt As Object
doc.Utility.GetEntity(returnObj, basePnt, "Выберите что-нибудь")
ssobjs(0) = returnObj
SelectionSet.AddItems(ssobjs)

Это работает.
Дмитрий Асташев вне форума  
 
Непрочитано 14.02.2012, 16:30
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Можно так, например выбрать единичный блок с атрибутами на слое "0":
Код:
[Выделить все]
        <CommandMethod("SinglePick", "spk", CommandFlags.Modal Or CommandFlags.UsePickSet)> _
        Public Sub SingleSelctionTest()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor

            Dim filt As New SelectionFilter(New TypedValue() { _
New TypedValue(0, "insert"), _
New TypedValue(66, 1), _
New TypedValue(8, "0")})
            Dim pso As New PromptSelectionOptions()
            pso.MessageForRemoval = vbCrLf & "You have to select an attributed block reference only: "
            pso.MessageForAdding = vbCrLf & "Select attributed block reference: "
            pso.SinglePickInSpace = True
            pso.SingleOnly = True
            pso.ForceSubSelections = False
            Dim res As PromptSelectionResult = ed.GetSelection(pso, filt)
            If res.Status <> PromptStatus.OK Then
                Return
            End If
            Try
                Dim tr As Transaction = db.TransactionManager.StartTransaction()
                Using tr
                    Dim blkId As ObjectId = res.Value.GetObjectIds(0)
                    Dim ent As Entity = DirectCast(tr.GetObject(blkId, OpenMode.ForRead), Entity)
                    Dim btrec As BlockTableRecord
                    If TypeOf ent Is BlockReference Then
                        Dim bref As BlockReference = DirectCast(ent, BlockReference)
                        If Not bref.IsDynamicBlock Then
                            btrec = DirectCast(tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead), BlockTableRecord)
                            ed.WriteMessage(vbLf & "   Block Name:   {0}", btrec.Name)
                        Else
                            btrec = DirectCast(tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead), BlockTableRecord)
                            ed.WriteMessage(vbLf & "   Block Name:   {0}"   , btrec.Name)
                        End If
                    Else
                        Return
                    End If
                    tr.Commit()
                End Using
            Catch ex As Autodesk.AutoCAD.Runtime.Exception
                ed.WriteMessage(vbLf & "{0}" & vbLf & "{1}", ex.Message, ex.StackTrace)
            End Try
        End Sub
Проверено в A2009 x64 Win7

~'o'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 14.02.2012, 19:49
#5
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Dim doc As Document =Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor
Подключено:
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Imports Autodesk.AutoCAD.Interop.AcadDocumentClass

не понимает (не определены): Document , Database , Editor, PromptSelectionOptions, PromptStatus, Transaction
Autodesk.AutoCAD.ApplicationServices
Autodesk.AutoCAD.Runtime.Exception

Какую библиотеку надо подключить? Подход очень понравился. Постараюсь с этим вариантом работать

P.S.
New TypedValue(0, "insert"), _
New TypedValue(66, 1)

А как Вы догадались, что меня интересуют блоки с xdata?

AC09.VS10.
Дмитрий Асташев вне форума  
 
Непрочитано 14.02.2012, 19:56
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Это внешнее exe-приложение? Тогда предложение Олег (jr.) не годится. Если же это .NET-сборка (dll-файл), которая грузится внутрь AutoCAD, то тогда нужно подключить acdbmgd.dll и acmgd.dll (установив CopyLocal в False). Подробнее здесь: http://images.autodesk.com/emea_apac...12-russian.zip

Цитата:
А как Вы догадались, что меня интересуют блоки с xdata?
Группа 66 означает, что в блоке есть неконстантные атрибуты, а не расширенные данные (XDATA): http://www.autodesk.com/techpubs/aut...t_al_u05_c.htm

Последний раз редактировалось Александр Ривилис, 14.02.2012 в 20:03.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 15.02.2012, 02:46
#7
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Александр, спасибо, замечательная презентация, все понятно.
В моем случае - внешнее приложение. Вариант с GetEntity подходит (хотя выглядит коряво и с последующими проверками на наличие атрибутов).
Дмитрий Асташев вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AcadSelectionSet. Выбор одного примитива из VB по типу (ssget "_:S")

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12