Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Natash
Зарегистрирован: 07.03.2007 Сообщения: 21
|
Добавлено: Пн Авг 09, 2010 10:52 am Заголовок сообщения: VBA. Как отследить координаты и параметры Fence |
|
|
Как отследить координаты и параметры Fence: type и mode, вводимые пользователем?
Type больше всего не понятно |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пн Авг 09, 2010 2:08 pm Заголовок сообщения: |
|
|
Сложная задачка... Может можно как-то обойти? Зачем вообще макросу следить за фенсой? |
|
Вернуться к началу |
|
|
Natash
Зарегистрирован: 07.03.2007 Сообщения: 21
|
Добавлено: Пн Авг 09, 2010 2:59 pm Заголовок сообщения: |
|
|
Leonid писал(а): | Сложная задачка... Может можно как-то обойти? Зачем вообще макросу следить за фенсой? |
нужно по координатам выбранных елементов(земельные участки) (shape, complex shape, complex element) считать из оракле спатиал аттрубутивную информацию етих елементов ... т.е. в базе данных есть вся эта геометрия.
пользователь хочет выбирать елементы и селектом и фенсом
есть скрипт который находит все елементы выбранные фенсом, потом обединяет их GetRegionUnion, потом делает список координат ConstructVertexList, потом уже с етими коотдинатами в базе данных...
а вот если бы просто отследить параметры фенса... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Вт Авг 10, 2010 10:13 am Заголовок сообщения: |
|
|
Natash писал(а): |
пользователь хочет выбирать елементы и селектом и фенсом
|
А просто перебор элементов не подойдет? (Примеры взяты из хелпа)
Код: |
Public Sub getSelectionSet ()
Dim oElEnum As ElementEnumerator
Dim oEl As Element
Set oElEnum = ActiveModelReference.GetSelectedElements
oElEnum.Reset
While oElEnum.MoveNext
Set oEl = oElEnum.Current
'process element...
Wend
End Sub
Public Sub getFenceElements()
Dim oFence As Fence
Dim oElEnum As ElementEnumerator
Dim oEl As Element
Set oFence = ActiveDesignFile.Fence
If oFence.IsDefined Then
Set oElEnum = oFence.GetContents
oElEnum.Reset
While oElEnum.MoveNext
Set oEl = oElEnum.Current
'process element...
Wend
End If
End Sub
|
|
|
Вернуться к началу |
|
|
Natash
Зарегистрирован: 07.03.2007 Сообщения: 21
|
Добавлено: Вт Авг 10, 2010 1:46 pm Заголовок сообщения: |
|
|
Leonid писал(а): |
А просто перебор элементов не подойдет? (Примеры взяты из хелпа)
|
"просто" перебором можно и работатет в принципе..
перебор только не совсем простой, комплекс елеменеты (вложенные шейпы или комплекс шейпы)приходится сначала дропать потом опять перебирать, а после GetRegionUnion на выходе может быть опять же комплекс елемент, т.е. опять присутствуют вложенные елементы, а это совсем лишнее,т.е. я даже не пойму как выделить внешний (exterior)елемент из группы комплекс елемент.
пробую GetInput...
спасибо |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Вт Авг 10, 2010 4:37 pm Заголовок сообщения: |
|
|
Natash писал(а): |
...приходится сначала дропать потом опять перебирать... |
не совсем понял - зачем дропать, ведь перебор вложенных элементов можно сделать через рекурсивную функцию
ну да может я действительно просто не въезжаю... тут похоже без пол-литры никак |
|
Вернуться к началу |
|
|
Natash
Зарегистрирован: 07.03.2007 Сообщения: 21
|
Добавлено: Вт Авг 10, 2010 5:19 pm Заголовок сообщения: |
|
|
Leonid писал(а): |
не совсем понял -
можно сделать через рекурсивную функцию
ну да может я действительно просто не въезжаю... |
да нет, это я не совсем ясно изьясняюсь, к тому же я не сильна в вба, да и вообще...
рекурсивная? ето какая? GetSubElements?
сделала по-другому и проще... отслеживать, что пользователь вводит сложно мне, решила, пускай будет уже готовый фенс, его координаты и срисую, да и фенсе моде для запроса в базу не нужно, он всегда оверлай...
наглядно
Код: |
Sub TraceFenceCoords()
Dim pts() As Point3d
Dim oFn As Fence
Dim oEl As Element
Dim oSubEls() As Element
Dim oElEn As ElementEnumerator
Dim rng As Range3d
Dim i, max As Long
Dim pnt As Point3d
If ActiveDesignFile.Fence.IsDefined Then
Set oEl = ActiveDesignFile.Fence.CreateElement
Debug.Print oEl.Type
If oEl.Type <> msdElementTypeCellHeader Then
pts() = oEl.ConstructVertexList(0)
Else
Set oElEn = oEl.AsComplexElement.GetSubElements
oSubEls = oElEn.BuildArrayFromContents
ReDim Preserve oSubEls(0 To UBound(oSubEls))
rng = oSubEls(0).Range
max = 0
For i = 0 To UBound(oSubEls)
If Range3dIsContainedInRange3d(rng, oSubEls(i).Range) Then
max = i
End If
Next
Set oEl = oSubEls(max)
End If
pts() = oEl.ConstructVertexList(0)
Dim CoordString As String
CoordString = ""
For i = LBound(pts) To UBound(pts) Step 1
CoordString = CoordString & Replace(CStr(pts(i).X), ",", ".") & "," & Replace(CStr(pts(i).Y), ",", ".") & ", "
Next
'Debug.Print CoordString
Else
MsgBox "Please, place fence!"
End If
End Sub
|
|
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Авг 11, 2010 12:50 pm Заголовок сообщения: |
|
|
рекурсия - это когда функция вызывает сама себя.
Это своего рода высший пилотаж, здесь нужно быть осторожным, так как при ошибке высока вероятность уйти в бесконечный цикл
Но в то же время, при обработке сложных элементв, когда неизвестен уровень их сложности, без нее не обойтись
Вот небольшой пример рекурсии
Функция processEnum вызывает сама себя, таки образом есть возможность протись по всем суб-элементам
Код: |
Public Sub recursExample()
processEnum ActiveModelReference.GetSelectedElements
End Sub
Public Sub processEnum(oElEnum As ElementEnumerator)
Dim oEl As Element
oElEnum.Reset
While oElEnum.MoveNext
Set oEl = oElEnum.Current
If oEl.IsComplexElement Then
' go to recursion
processEnum oEl.AsComplexElement.GetSubElements
Else
' process element
'...
Debug.Print oEl.Type
End If
Wend
End Sub
|
|
|
Вернуться к началу |
|
|
|