|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Возвращение координат.
был КМДистом, сейчас ЖБКист
Регистрация: 28.03.2007
Сообщений: 241
|
||
Просмотров: 8216
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Через DXF можно (13 и 14 группы), через VBA (он же activex) - не знаю. По-моему, не получится.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
А нечего было на VBA ставку делать
![]() ![]() Если серьезно, то можно попробовать сделать примерно так: вызвать лисп, в который (правда, не знаю как - может, проще всего будет передавать через UserS1) передать список хендлов размеров; лиспом взять координаты и сохранить в текстовый файл; лиспом же поднять "флаг выполнения" (например, та же самая UserS1 поменяет значение, а в vba выполнять проверку на изменение); через vba читать файл. Геморройно, но с утра пораньше у меня башка качественно не соображает.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Модифицировать - нет. Но вот удалить, а потом создать - да. Только все равно для создания надо знать базовые точки размера...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Оффтоп: Блин, чат получается
![]() Это не команда, а событие. Цитата:
1. Получить координаты все равно невозможно - передается-то объект, а не его ename-представление. 2. Даже если бы не было п.1, все равно - как получить координаты, если объект меняется? Какие координаты ты получишь - до модификации примитива или после? 3. И, наконец, последнее. Как его активировать-то, это событие (хотя тут можно сымитировать изменение - например, цвет; но вопрос - а состояние слоев ты отслеживать не собираешься? При такой работе на заблокированном слое, скорее всего, получишь ошибку).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
был КМДистом, сейчас ЖБКист Регистрация: 28.03.2007
Сообщений: 241
|
Я понял "Modified" это событие,которе активизируется когда с объектом что-то происходит.
Ну а если банально поменять ObjectName или ObjectID. Простите за мою простоту, это моя первая программа. Ну а если ничего непоможет, надо все взорвать. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Цитата:
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
ну это уж будет определяться твоим кодом. Но! Как бы ты ни крутился, все равно работать сможешь из-под vba с activex-объектом. dxf-представление его ты не получишь.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
был КМДистом, сейчас ЖБКист Регистрация: 28.03.2007
Сообщений: 241
|
Вот моя недоработанная программа.
Public filename As String Public Sub SelOnScreen() Dim objSS As AcadSelectionSet Dim excelsheet As Object: Dim i As Integer Dim acCircle As AcadCircle: Dim acline As AcadLine: Dim acArc As AcadArc: Dim AcEllipse As AcadEllipse Dim AcXline As AcadXline: Dim AcRay As AcadRay: Dim AcPolyline As AcadLWPolyline: Dim acSpline As AcadSpline Dim acText As AcadText: Dim acMText As AcadMText: Dim acRotDim As AcadDimAligned Dim retCoord As Variant: Dim x As Long: Dim y As Long Dim nbr_of_segments As Long: Dim nbr_of_vertices As Long: Dim segment As Long Dim StartWidth As Double: Dim EndWidth As Double 'Если косяк, пошел в дуню On Error GoTo Done 'Выбирай объекты With ThisDrawing.Utility Set objSS = ThisDrawing.SelectionSets.Add("TestSelectOnScreen") objSS.SelectOnScreen objSS.Highlight True .Prompt vbCr & objSS.Count & " entities selected" .GetString False, vbLf & "Enter to continue " objSS.Highlight False End With 'Если ничего не выбрал, пошел в дуню If objSS.Count = 0 Then GoTo Done 'Создаем таблицу Excel Set excelsheet = CreateObject("Excel.Sheet") excelsheet.Application.Visible = True With excelsheet.Application 'Заполняем таблицу For i = 0 To objSS.Count - 1 .cells(i + 1, 1).Value = objSS(i).ObjectName .cells(i + 1, 2).Value = objSS(i).TrueColor.ColorIndex .cells(i + 1, 3).Value = objSS(i).Linetype .cells(i + 1, 4).Value = objSS(i).LinetypeScale .cells(i + 1, 5).Value = objSS(i).Lineweight 'Данные для круга If objSS(i).ObjectName = "AcDbCircle" Then Set acCircle = objSS.Item(i) .cells(i + 1, 6).Value = acCircle.Center(0) .cells(i + 1, 7).Value = acCircle.Center(1) .cells(i + 1, 8).Value = acCircle.Radius End If 'Данные для линии If objSS(i).ObjectName = "AcDbLine" Then Set acline = objSS.Item(i) .cells(i + 1, 6).Value = acline.StartPoint(0) .cells(i + 1, 7).Value = acline.StartPoint(1) .cells(i + 1, 8).Value = acline.EndPoint(0) .cells(i + 1, 9).Value = acline.EndPoint(1) End If 'Данные для дуги If objSS(i).ObjectName = "AcDbArc" Then Set acArc = objSS.Item(i) .cells(i + 1, 6).Value = acArc.Center(0) .cells(i + 1, 7).Value = acArc.Center(1) .cells(i + 1, 8).Value = acArc.Radius .cells(i + 1, 9).Value = acArc.StartAngle .cells(i + 1, 10).Value = acArc.EndAngle End If 'Данные для элипса If objSS(i).ObjectName = "AcDbEllipse" Then Set AcEllipse = objSS.Item(i) .cells(i + 1, 6).Value = AcEllipse.Center(0) .cells(i + 1, 7).Value = AcEllipse.Center(1) .cells(i + 1, 8).Value = AcEllipse.MajorAxis(0) .cells(i + 1, 9).Value = AcEllipse.MajorAxis(1) .cells(i + 1, 10).Value = AcEllipse.RadiusRatio End If 'Данные для бесконечной If objSS(i).ObjectName = "AcDbXline" Then Set AcXline = objSS.Item(i) .cells(i + 1, 6).Value = AcXline.SecondPoint(0) .cells(i + 1, 7).Value = AcXline.SecondPoint(1) .cells(i + 1, 8).Value = AcXline.DirectionVector End If 'Данные для луча If objSS(i).ObjectName = "AcDbRay" Then Set AcRay = objSS.Item(i) .cells(i + 1, 6).Value = AcRay.BasePoint(0) .cells(i + 1, 7).Value = AcRay.BasePoint(1) .cells(i + 1, 8).Value = AcRay.SecondPoint(0) .cells(i + 1, 9).Value = AcRay.SecondPoint(1) End If 'Данные для полилинии If objSS(i).ObjectName = "AcDbPolyline" Then Set AcPolyline = objSS.Item(i) retCoord = AcPolyline.Coordinates x = LBound(retCoord) y = UBound(retCoord) nbr_of_vertices = (y + 1) \ 2 .cells(i + 1, 6).Value = nbr_of_vertices If AcPolyline.Closed Then nbr_of_segments = nbr_of_vertices .cells(i + 1, 7).Value = nbr_of_segments Else nbr_of_segments = nbr_of_vertices - 1 .cells(i + 1, 7).Value = nbr_of_segments End If x = 0: segment = 0 'Возвращение точек полилинии Do While nbr_of_vertices > 0 .cells(i + 1, x + 8).Value = retCoord(x) .cells(i + 1, x + 9).Value = retCoord(x + 1) x = x + 2: nbr_of_vertices = nbr_of_vertices - 1 Loop Do While nbr_of_segments > 0 'Возвращение начальной и конечной ширины полилинии,bulge AcPolyline.GetWidth segment, StartWidth, EndWidth .cells(i + 1, x + 8).Value = StartWidth .cells(i + 1, x + 9).Value = EndWidth .cells(i + 1, x + 10).Value = AcPolyline.GetBulge(segment) x = x + 3 segment = segment + 1: nbr_of_segments = nbr_of_segments - 1 Loop End If 'Данные для сплайна If objSS(i).ObjectName = "AcDbSpline" Then Set acSpline = objSS.Item(i) retCoord = acSpline.fitPoints x = LBound(retCoord) y = UBound(retCoord) nbr_of_vertices = (y + 1) \ 3 .cells(i + 1, 6).Value = nbr_of_vertices .cells(i + 1, 7).Value = acSpline.StartTangent(0) .cells(i + 1, 8).Value = acSpline.StartTangent(1) .cells(i + 1, 9).Value = acSpline.StartTangent(2) .cells(i + 1, 10).Value = acSpline.EndTangent(0) .cells(i + 1, 11).Value = acSpline.EndTangent(1) .cells(i + 1, 12).Value = acSpline.EndTangent(2) Do While nbr_of_vertices > 0 .cells(i + 1, x + 13).Value = retCoord(x) .cells(i + 1, x + 14).Value = retCoord(x + 1) .cells(i + 1, x + 15).Value = retCoord(x + 2) x = x + 3: nbr_of_vertices = nbr_of_vertices - 1 Loop End If 'Данные для однострочного текста If objSS(i).ObjectName = "AcDbText" Then Set acText = objSS.Item(i) .cells(i + 1, 6).Value = acText.TextString .cells(i + 1, 7).Value = acText.InsertionPoint(0) .cells(i + 1, 8).Value = acText.InsertionPoint(1) .cells(i + 1, 9).Value = acText.InsertionPoint(2) .cells(i + 1, 10).Value = acText.Height .cells(i + 1, 11).Value = acText.ObliqueAngle .cells(i + 1, 12).Value = acText.Rotation .cells(i + 1, 13).Value = acText.StyleName End If 'Данные для многострочного текста If objSS(i).ObjectName = "AcDbMText" Then Set acMText = objSS.Item(i) .cells(i + 1, 6).Value = acMText.InsertionPoint(0) .cells(i + 1, 7).Value = acMText.InsertionPoint(1) .cells(i + 1, 8).Value = acMText.InsertionPoint(2) .cells(i + 1, 9).Value = acMText.Width .cells(i + 1, 10).Value = acMText.TextString .cells(i + 1, 11).Value = acMText.StyleName .cells(i + 1, 12).Value = acMText.Rotation End If 'Данные для линейной размерности ????????????????? Next End With 'Вызов формы сохранения Frmsv.Show 'Сохраняем таблицу excelsheet.SaveAs "C:\Program Files\AutoCAD 2004\VBA\" & Trim$(filename) & ".XLS" excelsheet.Application.Quit 'Дуня Done: If Not objSS Is Nothing Then objSS.Delete End If End Sub |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Если честно, то мне интересна конечная цель этого кода. Что надо сделать-то?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
был КМДистом, сейчас ЖБКист Регистрация: 28.03.2007
Сообщений: 241
|
Это только часть кода.
В этой части все что попало под выделение должно быть переведено в Excel. В данном случае я застопорился на acaddimrotated.Нужно перенести в excel (XLine1Point, XLine2Point, DimLineLocation, RotationAngle) как минимум. В другой части,которая еще несделана идет обратный процесс.Но это еще не все. Появляется форма в которой предлагается заменить значения всех размеров (text.Measurement) на требуемое значение пользователем.Получается в какой-то степени "слепыш", кто конструктор тот поймет. |
|||
![]() |