Тема: Вопрос SelectCrossingWindow DOTNET

Всем привет. Мне необходимо получить все объекты аутокада в заданной точке. Решая указанную задачу использовал метод SelectCrossingWindow, дак вот у этого медота интересная особенность, он работает только с теми объектами которые видны в окне акада. Это так задумал аутодеск? Есть ли альтернативные способы решить задачу пользуя методы Select?

Re: Вопрос SelectCrossingWindow DOTNET

Владимир Петров пишет:

Это так задумал аутодеск?

Да.

Владимир Петров пишет:

Есть ли альтернативные способы решить задачу пользуя методы Select?

Нет. Только итератором по всем примитивам в текущем пространстве.

Re: Вопрос SelectCrossingWindow DOTNET

Александр, здравствуйте! Обнаружил еще одну интересную особенность методов select, метод не срабатывает (проверял на SelectCrossingWindow, SelectFence) когда например у меня есть прямоугольный блок и если область выделения не пересакает не один из примитовов из которых состоит блок, можно ли как то это обойти, чтоб если я область выделения находится в области выбераемого объекта и область не пересекает ни одного примитива то этот объект включается в набор.

Re: Вопрос SelectCrossingWindow DOTNET

Если прямоугольник (блок) полностью попадает в область выделения (рамку) - то он должен попасть в набор. Если рамка меньше чем прямоугольник, то в набор ничего попадать не должно.

Re: Вопрос SelectCrossingWindow DOTNET

Александр метод SelectWindow именно так работает. А метод SelectCrossingWindow срабатывает даже когда прямоугольник меньше чем выбераемый объект, но есть особенность о которой я указал выше. Как я понимаю что обойти эту особенность нельзя?

Re: Вопрос SelectCrossingWindow DOTNET

Владимир Петров пишет:

Как я понимаю что обойти эту особенность нельзя?

Правильно понимаешь. Смысл этого метода - "выбрать все что внутри рамки или пересекает ее".

Re: Вопрос SelectCrossingWindow DOTNET

Александр а чем принципиалное отличие SelectFence от SelectCrossingPolygon? НЕ могу понять.

Re: Вопрос SelectCrossingWindow DOTNET

SelectFence - отлавливает только пересечения, а SelectCrossingPolygon отлавливает и пересечения и примитивы которые попадают в область ограниченную полигоном.

Re: Вопрос SelectCrossingWindow DOTNET

Александр спасибо за ответы. Где можно прочитать описания этих методов, в arxmgd.chm я описаний работы методов не нашел?

Re: Вопрос SelectCrossingWindow DOTNET

Смотри описание Функции acedSSGet в arxref.chm

Re: Вопрос SelectCrossingWindow DOTNET

Добрый день.
Нужно в 3d найти объекты проходящие через точку. Пробую так, но не работает.
ed.SelectCrossingWindow(new Point3d(pt1.X - 0.1, pt1.Y - 0.1, pt1.Z - 0.1), new Point3d(pt1.X + 0.1, pt1.Y + 0.1, pt1.Z + 0.1), acSelFtr).
Подскажите пожалуйста, какие еще есть варианты.

Re: Вопрос SelectCrossingWindow DOTNET

Попробуй так, установи привязку на 512 или 513 вначале
(нет под рукой где проверить на ближайшую)
   

  Dim ppo As New PromptPointOptions(vbLf & "Pick a Point: ")
                    Dim ppr As PromptPointResult
                    ppr = ed.GetPoint(ppo)
                    If ppr.Status <> PromptStatus.OK Then
                        ed.WriteMessage(vbCrLf & "wrong point specification!")
                        Exit Sub
                    End If
                    Dim p As Point3d = ppr.Value
                    '------------------------------------------------------------''
                    Dim vd As Vector3d = New Vector3d(1e-4, 1e-4, 1e-4) '<--  dicrease a fuzz to suit
                    Dim pMin As Point3d = p - vd
                    Dim pMax As Point3d = p + vd              
                    Dim tvs() As TypedValue = New TypedValue() { New TypedValue(0, "line")} '<--  измени тип объекта здесь
                    Dim points As Point3dCollection = New Point3dCollection
                    points.Add(pMin)
                    points.Add(pMax)
                    Dim sf As SelectionFilter = New SelectionFilter(tvs)
                    Dim sres As PromptSelectionResult = ed.SelectFence(points, sf)
                    If sres.Status <> PromptStatus.OK Then
                        ed.WriteMessage("\nWrong selection!")
                        Return
                    End If

                    If sres.Value.Count = 0 Then
                        ed.WriteMessage("\nNothing selected!")
                        Return
                    End If
                    '' cast entity as Line
                    Dim eid As ObjectId = sres.Value.GetObjectIds(0)
                    Dim ent As Entity = TryCast(tr.GetObject(eid, OpenMode.ForRead), Entity)
                    ''-----------------------------------------------------------''
                    Dim ln As Line = TryCast(ent, Line)
                    If ln IsNot Nothing Then
                        ed.WriteMessage(vbLf + "{0},{1},{2}", ln.StartPoint.X, ln.StartPoint.Y, ln.StartPoint.Z)
                    End If

(изменено: Ирина, 13 мая 2014г. 15:04:42)

Re: Вопрос SelectCrossingWindow DOTNET

Попробовала, не работает, также как и ed.SelectCrossingWindow(new Point3d(pt1.X - 0.1, pt1.Y - 0.1, pt1.Z - 0.1), new Point3d(pt1.X + 0.1, pt1.Y + 0.1, pt1.Z + 0.1), acSelFtr).
Забыла уточнить, что чертеж состоит из 3DSolid.

Re: Вопрос SelectCrossingWindow DOTNET

Этот способ принципиально не годится. Если в чертеже 3DSolid, то нужно использовать BREP .NET API

Re: Вопрос SelectCrossingWindow DOTNET

Ирина пишет:

Попробовала, не работает, также как и ed.SelectCrossingWindow(new Point3d(pt1.X - 0.1, pt1.Y - 0.1, pt1.Z - 0.1), new Point3d(pt1.X + 0.1, pt1.Y + 0.1, pt1.Z + 0.1), acSelFtr).

Забыла уточнить, что чертеж состоит из 3DSolid.

Попробуй выполнить команду '_vscurrent 2d' перед запуском кода,
у меня выбирает 3DSolid без проблем, проверял в 2014-м