Скрипт на создание рамки...

Программирование для CATIA.

Скрипт на создание рамки...

Сообщение ShaytanTruba » 07 дек 2009 11:28

Вопрос такой:
По ЕСКД если в чертеже присутствует несколько листов одного чертежа, то первая рамка отстраивается полностью, а последующие листы имеют упрощенный вид.
А в скрипте есть условие что если количество листов больше 1 то он на всех создает упрощенный вид рамки. Попытался исправить условие что если лист первый то он создает один вид рамки, если 2-й и далее то упрощенный, но не получилось...

Код: Выделить всё
Dim nuSheet  As Integer
nuSheet  = 0
If (not DrwSheet.IsDetail) Then
    For e = 1 To DrwSheets.Count
      If (not DrwSheets.Item(e).IsDetail) Then
        nuSheet = nuSheet + 1
      End If
    Next
 End If

  If   ( nuSheet =1)  Then

... (создаются линии и текстовые поля)...

Else

...(создаются другие линии и текстовые поля)...
ShaytanTruba
Новичок
Новичок
 
Сообщения: 7
Зарегистрирован: 27 окт 2009 09:17

Re: Скрипт на создание рамки...

Сообщение Virty » 08 дек 2009 13:37

ShaytanTruba писал(а):но не получилось...

Что конкретно не получилось?
Какое значение получила переменная "nuSheet"? Или было сообщение об ошибке?
Аватара пользователя
Virty
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 26 янв 2009 19:55

Re: Скрипт на создание рамки...

Сообщение booSter » 08 дек 2009 15:22

Пример кода несколько загадочен...

Я бы писал так

Код: Выделить всё
...
' Retrieve DrawingSheets collection
Dim colSheets as DrawingSheets
Set colSheets = ...
...
' Declare proxy variables
Dim bfFirst as Boolean
bfFirst = True
Dim drwshCurr asDrawingSheet
Dim nbSheet as Integer
' Loop through the sheets
For nbSheet = 1 To colSheets.Count
    Set drwshCurr = colSheets.Item( nbSheet )
    If Not drwshCurr is Nothing Then ' use non-empty items
        If Not drwshCurr.IsDetail Then ' use non-details sheets
            If bfFirst Then
                bfFirst = False
                ' Put 1-st sheet treatment here
                ...
            Else
                ' Put rest sheets treatment here
                ...
            End If
        End If
    End If
Next
...
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: Скрипт на создание рамки...

Сообщение ShaytanTruba » 09 дек 2009 01:57

Virty писал(а):Что конкретно не получилось?
Какое значение получила переменная "nuSheet"? Или было сообщение об ошибке?



Не получилось прописать условие на создание рамки по номеру листу, а не по количеству их.

nuSheet получает значение равное количеству созданных листов. Если 1 лист то nuSheet=1, если 2 листа то nuSheet=2 и т.д....
ShaytanTruba
Новичок
Новичок
 
Сообщения: 7
Зарегистрирован: 27 окт 2009 09:17

Re: Скрипт на создание рамки...

Сообщение ShaytanTruba » 09 дек 2009 11:09

booSter писал(а):Пример кода несколько загадочен...

Я бы писал так

Код: Выделить всё
...
' Retrieve DrawingSheets collection
Dim colSheets as DrawingSheets
Set colSheets = ...
...
' Declare proxy variables
Dim bfFirst as Boolean
bfFirst = True
Dim drwshCurr asDrawingSheet
Dim nbSheet as Integer
' Loop through the sheets
For nbSheet = 1 To colSheets.Count
    Set drwshCurr = colSheets.Item( nbSheet )
    If Not drwshCurr is Nothing Then ' use non-empty items
        If Not drwshCurr.IsDetail Then ' use non-details sheets
            If bfFirst Then
                bfFirst = False
                ' Put 1-st sheet treatment here
                ...
            Else
                ' Put rest sheets treatment here
                ...
            End If
        End If
    End If
Next
...



Попробовал твой метод... получилось так что он одну рамку накладывает на другую...
ShaytanTruba
Новичок
Новичок
 
Сообщения: 7
Зарегистрирован: 27 окт 2009 09:17

Re: Скрипт на создание рамки...

Сообщение booSter » 09 дек 2009 12:37

Хм.......
Ну ладно, я-то "навскидку" пример набросал, может чего и не учёл

Попробуй для верности переписать так:
Код: Выделить всё
...
' Declare proxy variables
Dim drwshCurr as DrawingSheet
Dim nbSheets as Integer
nbSheets = colSheets.Count
Dim nbCurr as Intefer
' Loop through the sheets
For nbCurr = 1 To nbSheets
    Set drwshCurr = colSheets.Item( nbCurr )
    ...
    Set drwshCurr = Nothing ' Сlean up the reference
Next
...


А по поводу наложения мысль такая:
Перед тем как что-то делать в DrawingSheet-е его нужно сначала активировать вызовом DrawingSheet.Activate, затем достать из него (в твоём случае) BG-View, затем полученный BG-View нужно активировать вызовом DrawingView.Activate, после чего из BG-View нужно достать Factory2D, и только потом рисовать линии и пр. используя соответствующие методы из Factory2D полученной на предыдущем шаге.
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: Скрипт на создание рамки...

Сообщение Virty » 09 дек 2009 15:01

Ваш пример будет работать, если проверку условия "nuSheet" разместить внутри цикла:

Код: Выделить всё
If (Not DrwSheet.IsDetail) Then
  For e = 1 To DrwSheets.Count
    If (Not DrwSheets.Item(e).IsDetail) Then
      nuSheet = nuSheet + 1
      If( nuSheet =1 )  Then
       // ВЫЗЫВАЙТЕ SUB ДЛЯ РИСОВАНИЯ ПЕРВОГО/ЗАГЛАВНОГО ЛИСТА ЧЕРТЕЖА
      Else
       // ВЫЗЫВАЙТЕ SUB ДЛЯ РИСОВАНИЯ ВТОРОГО/ПОСЛЕДУЮЩЕГО ЛИСТА ЧЕРТЕЖА
      End If
    End If
  Next
End If
Аватара пользователя
Virty
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 26 янв 2009 19:55

Re: Скрипт на создание рамки...

Сообщение ShaytanTruba » 09 дек 2009 17:14

Virty писал(а):Ваш пример будет работать, если проверку условия "nuSheet" разместить внутри цикла:

Код: Выделить всё
If (Not DrwSheet.IsDetail) Then
  For e = 1 To DrwSheets.Count
    If (Not DrwSheets.Item(e).IsDetail) Then
      nuSheet = nuSheet + 1
      If( nuSheet =1 )  Then
       // ВЫЗЫВАЙТЕ SUB ДЛЯ РИСОВАНИЯ ПЕРВОГО/ЗАГЛАВНОГО ЛИСТА ЧЕРТЕЖА
      Else
       // ВЫЗЫВАЙТЕ SUB ДЛЯ РИСОВАНИЯ ВТОРОГО/ПОСЛЕДУЮЩЕГО ЛИСТА ЧЕРТЕЖА
      End If
    End If
  Next
End If



К сожалению не работает... точнее работает но так как я писал выше. Создает одну рамку поверх другой...
з.ы. Я уже так пробовал :)





booSter писал(а):Попробуй для верности переписать так:

Создает на одном листе столько рамок сколько всего листов...

booSter писал(а):А по поводу наложения мысль такая:
Перед тем как что-то делать в DrawingSheet-е его нужно сначала активировать вызовом DrawingSheet.Activate, затем достать из него (в твоём случае) BG-View, затем полученный BG-View нужно активировать вызовом DrawingView.Activate, после чего из BG-View нужно достать Factory2D, и только потом рисовать линии и пр. используя соответствующие методы из Factory2D полученной на предыдущем шаге.

Все это делается...
ShaytanTruba
Новичок
Новичок
 
Сообщения: 7
Зарегистрирован: 27 окт 2009 09:17

Re: Скрипт на создание рамки...

Сообщение Virty » 09 дек 2009 20:24

Действительно, Вы оказались правы.
Мне нужно больше тренироваться.
Условие, предложенное мной ранее, всё равно перебирает все листы до «DrwSheets.Count».

Предлагаю другую логику решения задачи: определить индекс листа в коллекции «DrwSheets»,
для этого узнаём имя «ActiveSheet» и сравниваем его со всеми именами листов в «DrwSheets».
Как только имя совпадает, получаем индекс листа по его имени и решаем, какую основную надпись делать.

Код: Выделить всё
Dim sCurrentName As String
Dim iSheet As Integer
Dim iTotalSheets As Integer
Dim iSheetIndex As Integer

iTotalSheets = oSheets.Count
sCurrentName = oSheet.Name

If (Not oSheet.IsDetail) Then
  For iSheet = 1 To iTotalSheets
    If (Not oSheets.Item(iSheet).IsDetail) Then
      If (sCurrentName = oSheets.Item(iSheet).Name) Then
        iSheetIndex =  iSheet
        Exit For
      End If
    End If
  Next
End If

If  (iSheetIndex = 1) Then
  // ВЫЗЫВАЙТЕ SUB ДЛЯ РИСОВАНИЯ ПЕРВОГО/ЗАГЛАВНОГО ЛИСТА ЧЕРТЕЖА
Else
  // ВЫЗЫВАЙТЕ SUB ДЛЯ РИСОВАНИЯ ВТОРОГО/ПОСЛЕДУЮЩЕГО ЛИСТА ЧЕРТЕЖА
End If


При условии, что:

Код: Выделить всё
Public oDocument   As DrawingDocument
Public oSheets   As DrawingSheets
Public oSheet      As DrawingSheet

Sub CATInit()

   Set oDocument = CATIA.ActiveDocument
   Set oSheets = oDocument.Sheets
   Set oSheet = oDocument.Sheets.ActiveSheet

/* OTHER PROPERTIES  */

End Sub
Аватара пользователя
Virty
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 26 янв 2009 19:55

Re: Скрипт на создание рамки...

Сообщение ShaytanTruba » 10 дек 2009 17:34

Большое спасибо Virty, сделал как ты показал. Все вроде работает ;)
ShaytanTruba
Новичок
Новичок
 
Сообщения: 7
Зарегистрирован: 27 окт 2009 09:17

Re: Скрипт на создание рамки...

Сообщение ExtraRight » 11 дек 2009 10:03

Извините, что вмешиваюсь, уважаемые наши программеры :)
Если кому не жалко, выложите, плиз в разделе Кладовая по локализации полноценный и работающий скрипт рамки чертежа вот в этой теме -
Чертежи в CATIA: Скрипт для создания рамок
Аватара пользователя
ExtraRight
Forum Manager
 
Сообщения: 1575
Зарегистрирован: 11 сен 2007 18:50
Откуда: Нижний Новгород
Blog: View Blog (8)


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2