Тема: Выбирать многоугольником
Выбирать многоугольником - кто как реализовывал это на VBA???
Возможно, стоит подключить какие-то команды Lisp'a?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Выбирать многоугольником
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Выбирать многоугольником - кто как реализовывал это на VBA???
Возможно, стоит подключить какие-то команды Lisp'a?
> Artem
Из моих предыдущих экспериментов
Выбирает все тексты внутри контура, находящиеся
на слое "ANNO-TEXT"
Попробуй измени по своим критериям
Option Explicit Public Sub Ch_SelectByPolygon() Dim setObj As AcadSelectionSet Dim setColl As AcadSelectionSets Dim objEnt As AcadEntity Dim plineObj As AcadLWPolyline Dim pickPnt As Variant Dim setName As String Dim selMod As Long Dim vertPts As Variant Dim dblElv As Double Dim gpCode(1) As Integer Dim dataValue(1) As Variant Dim dxfcode, dxfdata Dim selPts As Variant On Error GoTo SayMeAbout gpCode(0) = 0: gpCode(1) = 8 dataValue(0) = "TEXT": dataValue(1) = "ANNO-TEXT" dxfcode = gpCode: dxfdata = dataValue setName = "PolygonSelect" With ThisDrawing Set setColl = .SelectionSets For Each setObj In setColl If setObj.Name = setName Then .SelectionSets.Item(setName).Delete Exit For End If Next Set setObj = .SelectionSets.Add(setName) End With ThisDrawing.Utility.GetEntity objEnt, pickPnt, vbCr & "Select polyline :" If Not TypeOf objEnt Is AcadLWPolyline Then MsgBox "It is not a lightweight polyline", vbExclamation, "Programm stopped" Exit Sub Else Set plineObj = objEnt dblElv = plineObj.Elevation vertPts = plineObj.Coordinates selPts = ConvTo3dPoints(vertPts, dblElv) '\\' An array of 3D WCS coordinates specifying the selection fence Debug.Print UBound(selPts) selMod = acSelectionSetWindowPolygon 'acSelectionSetCrossingPolygon ' '\\' change mode by suit setObj.SelectByPolygon selMod, selPts ', dxfcode, dxfdata setObj.Highlight True MsgBox "Selected: " & CStr(setObj.Count) ' >> do your stuffs here End If SayMeAbout: MsgBox Err.Description End Sub Public Function ConvTo3dPoints(objCoors As Variant, dblElv As Double) As Variant Dim i As Long, j As Long Dim convPts() As Double j = 0 For i = LBound(objCoors) To UBound(objCoors) Step 2 ReDim Preserve convPts(0 To j) convPts(j) = objCoors(i) ReDim Preserve convPts(0 To j + 1) convPts(j + 1) = objCoors(i + 1) ReDim Preserve convPts(0 To j + 2) convPts(j + 2) = dblElv j = j + 3 Next ConvTo3dPoints = convPts End Function
~'J'~
> Fatty
А может проще как-то так:
ReDim convPts(UBound(objCoors) * 3) As Double j = 0 For i = LBound(objCoors) To UBound(objCoors) Step 2 convPts(j) = objCoors(i) convPts(j + 1) = objCoors(i + 1) convPts(j + 2) = dblElv j = j + 3 Next i
Я имею ввиду как бы динамический выбор типа как по команде “_.pselect _cp”
Только как это можно реализовать с помощью VBA?
Можно сделать что то типа
frmStart.Hide
ThisDrawing.SendCommand "_.PSELECT _CP" & vbCr
ThisDrawing.SendCommand vbCr
If ThisDrawing.PickfirstSelectionSet.Count <> 0 Then
End if
frmStart.show
Но в таком случае как только я начинаю двигать экран выскакивает моя форма (frmStart) а мне бы хотелось сначала выбрать а потом уже выскочила форма
> Artem
Вот пример как выбирать указывая точки
ограничивающие многоугольник выбора
Переделай по вкусу
Option Explicit Sub CP() Dim PointsList() As Double Dim p1, p2 Dim i As Integer, j As Integer p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Specify first point: ") ReDim Preserve PointsList(i + 2) As Double PointsList(i) = p1(0) PointsList(i + 1) = p1(1) PointsList(i + 2) = p1(2) i = i + 3 Do On Error Resume Next p2 = ThisDrawing.Utility.GetPoint(p1, vbCrLf & "Specify next point or hit ENTER to exit: ") If Err Then Err.Clear Exit Do End If On Error GoTo 0 ReDim Preserve PointsList(i + 2) As Double PointsList(i) = p2(0) PointsList(i + 1) = p2(1) PointsList(i + 2) = p2(2) i = i + 3 For j = 0 To 2 p1(j) = p2(j) Next Loop On Error GoTo 0 Dim oSset As AcadSelectionSet With ThisDrawing.SelectionSets While .Count > 0 .Item(0).Delete Wend End With With ThisDrawing.SelectionSets Set oSset = .Add("$PolySet$") End With Dim mode As Integer mode = acSelectionSetWindowPolygon '' ''acSelectionSetCrossingPolygon '' oSset.SelectByPolygon mode, PointsList MsgBox "Number of entities selected: " & vbCr & _ vbTab & oSset.Count End Sub
~'J'~
Спасибо!
Да такой вариант возможен (с некоторой доработкой) но это несколько не красиво получается, не как в самом AutoCAD и не так наглядно…. Хочется выбирать так же как позволяет это сделать AutoCAD при выборе объектов обычным методом VBA (acSelectionSetAll) если в командной строке прописать (_cp) и нажать enter!
Может в Lisp есть подобная команда (хотя это не совсем тот раздел но все равно)?
> Artem
Тогда только через SendCommand
(Я как-то не шибко его люблю):
Sub test() Dim ss As AcadSelectionSet Set ss = ThisDrawing.ActiveSelectionSet ss.Delete ThisDrawing.SendCommand "(command)" & vbCr ThisDrawing.SendCommand "select _cp pause " ThisDrawing.SendCommand vbCr Set ss = ThisDrawing.ActiveSelectionSet MsgBox "You just selected: " & ss.Count & " items" End Sub
~'J'~
Fatty - спасибо большущее!
Я тоже SendCommand не люблю, но что делать?
, но что делать?
Постепенно переходить на другой уровень(C++/ARX или C#/VB.NET)
IMHO
~'J'~
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Выбирать многоугольником
Форум работает на PunBB, при поддержке Informer Technologies, Inc