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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Возвращение координат.

Возвращение координат.

Ответ
Поиск в этой теме
Непрочитано 28.03.2007, 16:06 #1
Возвращение координат.
Constructor450
 
был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241

Как в VBA возвратить начальную и конечную точку размерности?
Просмотров: 8219
 
Непрочитано 28.03.2007, 22:09
#2
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Какой размерности-то?? Можно уточнить, о чем речь?
den001 вне форума  
 
Автор темы   Непрочитано 29.03.2007, 04:55
#3
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


AcadDimRotated.
Constructor450 вне форума  
 
Непрочитано 29.03.2007, 08:14
#4
Кулик Алексей aka kpblc
Moderator

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


Через DXF можно (13 и 14 группы), через VBA (он же activex) - не знаю. По-моему, не получится.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.03.2007, 11:14
#5
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


А другие мнения есть у кого-нибудь?
Constructor450 вне форума  
 
Непрочитано 29.03.2007, 20:56
#6
den001

Инженер по автоматизации (строительство)
 
Регистрация: 05.05.2006
Люберцы
Сообщений: 241


Честно сказать, с размерами возиться не приходилось. При беглом осмотре решения, действительно, не видно. В свойствах есть все, кроме искомого
den001 вне форума  
 
Автор темы   Непрочитано 30.03.2007, 08:19
#7
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


Значит моя программа летит ко всем чертям.
Хотел что-бы с чертежа все выделенные объекты автокада переносились в Excel, а потом их можно было вставить в любой чертеж.Такая своя база данных.
Constructor450 вне форума  
 
Непрочитано 30.03.2007, 08:31
#8
Кулик Алексей aka kpblc
Moderator

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


А нечего было на VBA ставку делать Шутка
Если серьезно, то можно попробовать сделать примерно так: вызвать лисп, в который (правда, не знаю как - может, проще всего будет передавать через UserS1) передать список хендлов размеров; лиспом взять координаты и сохранить в текстовый файл; лиспом же поднять "флаг выполнения" (например, та же самая UserS1 поменяет значение, а в vba выполнять проверку на изменение); через vba читать файл. Геморройно, но с утра пораньше у меня башка качественно не соображает.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.03.2007, 08:48
#9
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


А если попробывать модифицировать AcadDimRotated
в AcadDimAligned . Такое возможно?
Constructor450 вне форума  
 
Непрочитано 30.03.2007, 08:55
#10
Кулик Алексей aka kpblc
Moderator

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


Модифицировать - нет. Но вот удалить, а потом создать - да. Только все равно для создания надо знать базовые точки размера...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.03.2007, 08:59
#11
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


А команда object.Modified(Entity) что может сделать?
Constructor450 вне форума  
 
Непрочитано 30.03.2007, 09:08
#12
Кулик Алексей aka kpblc
Moderator

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


Оффтоп: Блин, чат получается
Это не команда, а событие.
Цитата:
This event will be triggered whenever the object is modified. Modification includes whenever the value of a property is set, even if the new value is equal to the current value.

When coding in VBA, you must provide an event handler for all objects enabled for the Modified event. If you do not provide a handler, VBA may terminate unexpectedly.

No events will be fired while a modal dialog is being displayed.
Как я понимаю, фактически объектный реактор, который прописан просто на VBA. Но оно тут поможет как мертвому припарки - оно начинает работать только в момент модификации примитива. А поскольку это так, то тут есть несколько проблем:
1. Получить координаты все равно невозможно - передается-то объект, а не его ename-представление.
2. Даже если бы не было п.1, все равно - как получить координаты, если объект меняется? Какие координаты ты получишь - до модификации примитива или после?
3. И, наконец, последнее. Как его активировать-то, это событие (хотя тут можно сымитировать изменение - например, цвет; но вопрос - а состояние слоев ты отслеживать не собираешься? При такой работе на заблокированном слое, скорее всего, получишь ошибку).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.03.2007, 12:20
#13
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


Я понял "Modified" это событие,которе активизируется когда с объектом что-то происходит.
Ну а если банально поменять ObjectName или ObjectID.
Простите за мою простоту, это моя первая программа.

Ну а если ничего непоможет, надо все взорвать.
Constructor450 вне форума  
 
Непрочитано 30.03.2007, 12:44
#14
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Я понял "Modified" это событие,которе активизируется когда с объектом что-то происходит.
Ага, только его "запустить" надо.
Цитата:
банально поменять ObjectName или ObjectID.
Где поменять? Где там это участвует? Вот пример из справки:
Код:
[Выделить все]
Public WithEvents PLine As AcadLWPolyline    ' Use with Modified Event Example
Sub Example_Modified()
     ' This example creates a lightweight polyline in model space and
     ' references the PolyLine using the public variable (PLine) which
     ' is set up to intercept Modified events.
     '
     ' This example then modifies the new object, triggering the code
     ' in the Modified event.
    
    Dim points(0 To 9) As Double
    
    ' Define the 2D polyline points
    points(0) = 1: points(1) = 1
    points(2) = 1: points(3) = 2
    points(4) = 2: points(5) = 2
    points(6) = 3: points(7) = 2
    points(8) = 4: points(9) = 4
        
    ' Create a lightweight Polyline object in model space
    '
    ' * Note: We are returning the new PolyLine object into a Module
    ' level variable.  This allows us to intercept events associated
    ' with that particular object.
    Set PLine = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)
    
    ThisDrawing.Application.ZoomAll
    
    ' Modify object to trigger event.
    '
    ' * Note: The event code for the PolyLine modification will be triggered
    ' before we move forward and refresh the view, so the line will not
    ' appear blue when the event message box is displayed.
    Dim color As AcadAcCmColor
    Set color = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.16")
    Call color.SetRGB(80, 100, 244)
    PLine.TrueColor = color

    ThisDrawing.Regen acAllViewports
    
End Sub

Private Sub PLine_Modified(ByVal pObject As AutoCAD.IAcadObject)
    ' This example intercepts an object's Modified event.
    '
    ' This event is triggered when an object supporting this event is modified.
    '
    ' To trigger this code: Modify an object connected to this event
    ' * Note: By connected, we mean the object set up to intercept events using
    ' the VBA WithEvents statement

    ' Use the "pObject" variable to determine which object was modified
    MsgBox "You just modified an object with an ID of: " & pObject.ObjectID
    
End Sub
То есть ты передаешь не ObjectName или ObjectID, а напрямую указатели на примитивы. Попытка передать "нештатные" значение вывалит ошибку.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.03.2007, 12:48
#15
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


Не в "Modified", а в своей программе.
Constructor450 вне форума  
 
Непрочитано 30.03.2007, 12:53
#16
Кулик Алексей aka kpblc
Moderator

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


ну это уж будет определяться твоим кодом. Но! Как бы ты ни крутился, все равно работать сможешь из-под vba с activex-объектом. dxf-представление его ты не получишь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.03.2007, 14:10
#17
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 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
Constructor450 вне форума  
 
Непрочитано 30.03.2007, 14:49
#18
Кулик Алексей aka kpblc
Moderator

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


Если честно, то мне интересна конечная цель этого кода. Что надо сделать-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.03.2007, 15:08
#19
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


Это только часть кода.
В этой части все что попало под выделение должно быть переведено в Excel.
В данном случае я застопорился на acaddimrotated.Нужно перенести в excel (XLine1Point, XLine2Point, DimLineLocation, RotationAngle) как минимум.
В другой части,которая еще несделана идет обратный процесс.Но это еще не все. Появляется форма в которой предлагается заменить значения всех размеров (text.Measurement) на требуемое значение пользователем.Получается в какой-то степени "слепыш", кто конструктор тот поймет.
Constructor450 вне форума  
 
Автор темы   Непрочитано 02.04.2007, 10:52
#20
Constructor450

был КМДистом, сейчас ЖБКист
 
Регистрация: 28.03.2007
Сообщений: 241


Решил дополнительно учить LISP.
Может кто-нибудь поможет перевести с VBA некоторые фрагменты моего кода? Касательно технологии передачи ячейкам excelя значений.
Constructor450 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Возвращение координат.

Опции темы Поиск в этой теме
Поиск в этой теме:

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