Список форумов Конференция САПР Bentley MicroStation Конференция САПР Bentley MicroStation
www.ustation.ru
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

VBA. Как отследить координаты и параметры Fence

 
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Заголовок сообщения: Ответить с цитатой

Сложная задачка... Может можно как-то обойти? Зачем вообще макросу следить за фенсой?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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
 
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 писал(а):

...приходится сначала дропать потом опять перебирать...


не совсем понял - зачем дропать, ведь перебор вложенных элементов можно сделать через рекурсивную функцию

ну да может я действительно просто не въезжаю... тут похоже без пол-литры никак Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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

Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Прикладное Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group