Транслятор BOM_out

Автор rain, 07.12.15, 11:39:48

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

rain

Здравствуйте, коллеги!
мне нужен совет по поводу лоцмана. сейчас правлю трансляторы после предыдущего программиста (скажу сразу, что я не программист, а конструктор, но приходится заниматься такими вещами). дело вот в чем.
выходной транслятор спецификации. В компасе конструктор создает прочее изделие, добавляет в этот раздел изделие из МиС (они допиливали справочник, добавляли туда свои изделия). и когда я в лоцмане получаю информацию из спецификации, в трансляторе проверяется условие, что изделие находится в разделе Прочие изделия и является Материалом по КД. Если это условие выполняется, то в лоцмане в дереве этот объект отображается как Прочее изделие. Суть в том, что если допустим какой-то диод из спецификации есть в базе лоцмана (в составе другого изделия) в виде прочего изделия, то он добавляется в дерево нового проекта как Прочее (т.е. так, как нам и нужно). если же его нет в лоцмане, то вообще ничего не добавляется. Я так понял, суть в том, что если указанное выше условие выполняется, то в трансляторе нужно прописать создание прочего изделия. А я пока не могу точно понять, как создавать объект. прочитал в инете по этому поводу, пишут "Set Объектная_переменная = CreateObject("Библиотека.Класс")". Можете объяснить, что писать в этом случае?
на данный момент код выглядит так:

     stType = GetPropValueOrEmpty(cmObject, C_TYPE)
     stBOM_Section = GetPropValueOrEmpty(cmObject, C_KG_BOMSECTION)

     if AnsiSameText(stType, C_KG_MATERIAL_KD) _
     and (stBOM_Section = "Прочие изделия") then
         Set stType = CreateObject(C_KG_OTHER)
         SetPropValue cmObject, C_KG_BOMSECTION, C_KG_SPC_SECTION_NAME_OTHER
     End if

но при этом новых объектов в лоцмане не создается

Danila

1. Начнем с того, права в конфигураторе Лоцмана у этого человека на создание нового прочего есть? Именно право на создание!

2. Никакой ошибки при создании не выдается? нет прав и т.д.?

3. Просто происходит выгрузка, но без этого элемента?

4. Еще есть важный момент - в списке модели присутствует вообще этот элемент или нет?..
Это в режиме выгрузки необходимо визуализировать представление модели.

4. Создавать новый вроде как не обязательно. Необходимо подготовить выходной тип объекта.
Вроде как это делается внутри функции
Function fTransForLoodsman(Model)

Например, так SetPropValue cmObject, C_TYPE, C_KG_OTHER

5. Если не заменять - он же же должен создаться как Материал, правильно понимаю?
А нам только надо поменять его свойство - Тип объекта, все верно?
Пробовали без этого кода настроить так, чтоб выгружался как Материал?


rain

1) да, права есть, т.к. этот человек - я сам (пока что)
2) ошибок не выдает
3) просто втихую выгружает, нужный элемент не выгружает.
4) см. рисунки: в списке модели есть Транзистор, а в дерево лоцмана он не выгружается.
т.е. ситуация такая: там два элемента Диод и Транзистор. Диод есть в базе лоцмана как прочее изделие, Транзистора там нет. В результате Диод выгружается, а Транзистор - нет.
5) создавать новый объект - это уже мои домысли и догадки. в начале пробовал, чтобы создавался Материал и изменялся на тип Прочее, но ничего не происходит.

Danila

1. Есть рисунки - в студию их. Увидеть модель - было бы шикарно)

2. Если есть возможность дать bom_out - будет еще лучше.

3. Если вставить Материал в раздел Материалы и Прочее в раздел Прочих - выгрузится?

4. Если добавить Прочее и Материал в раздел Комплектов - выгружается? Ведь точно такой же элемент можно разместить не только в основной раздел, но и в раздел Комплекты.



rain

меня смущает вот эта строчка в коде:
    if AnsiSameText(stType, C_KG_MATERIAL_KD) _
    and (stBOM_Section = "Прочие изделия") then
         SetPropValue cmObject, C_TYPE, C_KG_OTHER
         SetPropValue cmObject, C_KG_BOMSECTION, C_KG_SPC_SECTION_NAME_OTHER

правильно ли я задаю условие, Если тип объекта - Материал по КД и если эта запись находится в разделе спецификации Прочие изделия, то следует заменить тип Материал на тип Прочее изделие?
потому что если проверять только условие if AnsiSameText(stType, C_KG_MATERIAL_KD), то любой материал без проблем заменяется на прочее. мне же нужно дополнительное условие, учитывающее, в каком разделе спецификации (в компасе) находится этот самый материал

забыл рисунки приложить

rain

Из комплектов тоже ничего не выгружается

rain

приложил транслятор. мое условие проверяется на 193 строчке

Danila

07.12.15, 13:44:24 #7 Последнее редактирование: 07.12.15, 17:56:43 от Danila
Можно вставить MsgBox для отладки и посмотреть, куда и с какими значениями попадает ваш алгоритм.

Например, так

Set cmObject = model.Objs(i) ' текущий объект модели
stName = Trim(GetPropValueOrEmpty(cmObject, "NAME"))
'setPropValue cmObject, "NAME", stName

stType = Trim(GetPropValueOrEmpty(cmObject, "TYPE"))
'setPropValue cmObject, "TYPE", stType

stProduct = Trim(GetPropValueOrEmpty(cmObject, "PRODUCT"))
'setPropValue cmObject, "PRODUCT", stProduct

stDesignation = Trim(GetPropValueOrEmpty(cmObject, "DESIGNATION"))
'setPropValue cmObject, "DESIGNATION", stDesignation

stSection = Trim(GetPropValueOrEmpty(cmObject, "BOMSECTION")) 'Чтение информации о разделе спецификации
'setPropValue cmObject, "BOMSECTION", stSection 'Запись информации о разделе спецификации

MsgBox  "stName: "   + stName + "; stType: " +  stType + "; stProduct: " +  stProduct + "; stDesignation: " +  stDesignation + "; stSection: " +  stSection

rain

вставлять нужно именно в таком формате, ничего менять не нужно?
в какое место кода лучше это вставить?

Danila

07.12.15, 14:09:38 #9 Последнее редактирование: 07.12.15, 17:56:30 от Danila
Может, как-то так двигаться?

     ' Здесь проверяется условие, о котором я писал на форуме
     stType = GetPropValueOrEmpty(cmObject, C_TYPE)
     stBOM_Section = GetPropValueOrEmpty(cmObject, C_KG_BOMSECTION)

    'Здесь можно разместить отладку, ее можно использовать скорее только в формате MSgBox, например, как ниже.
    'Так мы увидим что и в каком виде попадает в обработку,  какие значения у переменных
     MsgBox stProduct + " " + stDesignation + " " +  stType + " " + stBOM_Section

     if AnsiSameText(stType, C_KG_MATERIAL_KD) _
     and (stBOM_Section = "Прочие изделия") Then
         SetPropValue cmObject, C_TYPE, C_KG_OTHER
       
         'Может и здесь проверить, попадает ли сюда? MsgBox в помощь
         stType = GetPropValueOrEmpty(cmObject, C_TYPE) 'Получим заново значение типа
         MsgBox "Однако, меняем тип и теперь он " + stType

         'Не очень понял зачем менять раздел, он не имеет значения в данном случае, можно закомментировать пока
         'SetPropValue cmObject, C_KG_BOMSECTION, C_KG_SPC_SECTION_NAME_OTHER
     End if

rain

насколько я понимаю, все попадает в нужные разделы, но дерево остается без изменений

Danila

07.12.15, 14:45:59 #11 Последнее редактирование: 07.12.15, 17:56:05 от Danila
Тогда надо проверить раздел, где может удаляться объект или его связь.

'----------------------------------------------------------------------
    '          //  10. Вырезать из модели документы, не имеющие файлов
    '----------------------------------------------------------------------
    ' Если это документ по признаку или типу


    if AnsiSameText(GetPropValueOrEmpty(cmObject, "DOCUMENT"), "TRUE") or _
       AnsiSameText(GetPropValueOrEmpty(cmObject, "TYPE"), "2DDRW") or _
       AnsiSameText(GetPropValueOrEmpty(cmObject, "TYPE"), "3DDRW") or _
       AnsiSameText(GetPropValueOrEmpty(cmObject, "TYPE"), "2DASM") or _
       AnsiSameText(GetPropValueOrEmpty(cmObject, "TYPE"), "BOM") or _
       AnsiSameText(GetPropValueOrEmpty(cmObject, "TYPE"), "3DASM") then
       if not AnsiSameText(GetPropValueOrEmpty(cmObject, "BOMSECTION"), "Документация") then
         boFileFound = false
         For j = 0 to cmObject.LinkCount-1                 ' по всем связям
            stLinkName = GetPropValueOrEmpty(cmObject.Links(j), C_TYpe)'  берем связь
            if AnsiSameText(stLinkName, "Document-File link") then
               boFileFound = true ' есть файл
               Exit For
            end if
         Next
         ' удаляем
         if not boFileFound then
            cmobject.Delete
         end if
       end if
    end if


rain

закаментил пункт 10, без него работает все так же, т.е. дело не в нем  :(

Danila

07.12.15, 15:39:05 #13 Последнее редактирование: 07.12.15, 17:55:48 от Danila
1. А в этот MsgBox попадает?
MsgBox "Однако, меняем тип и теперь он " + stType

2. Если вообще убрать смену типа - отработает?

3. Давайте спецификацию сюда.
Может, какие-то поля другие.

4. При смене типа - надо бы еще проверить, что все поля DESIGNATION, NAME, PRODUCT заполнены


' Здесь проверяется условие, о котором я писал на форуме
     stType = GetPropValueOrEmpty(cmObject, C_TYPE)
     stBOM_Section = GetPropValueOrEmpty(cmObject, C_KG_BOMSECTION)
 
    [b] 'Прочитаем все поля, какие-то из них могут у вас быть критичными при заполнении, я не знаю, как у вас настроено в конфигураторе
      stName = Trim(GetPropValueOrEmpty(cmObject, "NAME"))
      stProduct = Trim(GetPropValueOrEmpty(cmObject, "PRODUCT"))
      stDesignation = Trim(GetPropValueOrEmpty(cmObject, "DESIGNATION"))[/b]
[b]
    'Посмотрим какие поля не пустые, а какие пустые
    MsgBox  "stName: "   + stName + "; stType: " +  stType + "; stProduct: " +  stProduct + "; stDesignation: " +  stDesignation + "; stSection: " +  stSection
[/b]
     if AnsiSameText(stType, C_KG_MATERIAL_KD) _
     and (stBOM_Section = "Прочие изделия") Then
         SetPropValue cmObject, C_TYPE, C_KG_OTHER
       
         'Может и здесь проверить, попадает ли сюда? MsgBox в помощь
         stType = GetPropValueOrEmpty(cmObject, C_TYPE) 'Получим заново значение типа
         MsgBox "Однако, меняем тип и теперь он " + stType

         [b]'Добавим заполнение пустых полей, возможно идет анализ на их наличие, заполним их полем PRODUCT, если конечно, оно не пустое
         setPropValue cmObject, "NAME", stProduct
         setPropValue cmObject, "DESIGNATION", stProduct [/b]

         'Не очень понял зачем менять раздел, он не имеет значения в данном случае, можно закомментировать пока
         'SetPropValue cmObject, C_KG_BOMSECTION, C_KG_SPC_SECTION_NAME_OTHER
     End if


rain

1. А в этот MsgBox попадает?
MsgBox "Однако, меняем тип и теперь он " + stType - нет, этого сообщения не вылетает

2. если убрать смену типа, то нужные объекты даже в Материалы не выгружаются

3. прикрепляю спецификацию

Danila

1.
Цитировать1. А в этот MsgBox попадает?
MsgBox "Однако, меняем тип и теперь он " + stType - нет, этого сообщения не вылетает

Значит и тип не меняется)

2. И судя по MsgBox - все прочие,а не материалы по КД. Действительно, они не попадут внутрь)

3. А можно сохранить  spw в более ранней версии? У меня компас старенький, а вьюер всю необходимую инфу не даст)
У меня если что компас 11)

rain

прикрепил спецификацию в более ранней версии

Danila

Действительно проблема в заполнении данных в спецификации:

Не хватает данных на транзисторе.

Поэтому его выгрузка игнорирует.

rain

Хм, значит, когда создавалось прочее изделие в лоцмане для Диода, тогда же и произошло заполнение этой графы? попробовал вручную для транзистора вбить наименование, лоцман все равно его проигнорировал.
может быть нужно, чтобы в трансляторе было прописано, чтобы эта графа заполнялась?

Danila

1. Вы же не из Лоцмана вставляете компоненты, а из МиС?
Это поле заполняется оттуда. Ему должно быть соответствие в справочнике. В Лоцман эти данные уже просто импортируются из справочника.

2. Надо смотреть, правильно ли заведены эти компоненты в МиС.

3. Но в вашем случае это вообще Прочие фактически. Но значит, для прочих должны быть настроены в конфигураторе для Прочего изделия в свойствах правильным образом связи с Бизнес-объектом: Справочником МиС.

4. Можно попробовать вручную в Лоцмане создать новое Прочее изделие и выбрать из справочника МиС этот компонент - получится ли создать?