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

Автор Akew, 02.08.18, 21:42:55

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

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

Akew

Вопрос является продолжением (дополнением) моей же темы http://forum.ascon.ru/index.php/topic,31228.msg248985.html#msg248985.

В чертеже требуется отключить передачу обозначений размеров из 3D модели во все виды чертежа (IKompasDocument2D).
Делаю это так:
- получаю IViews чертежа,
- в цикле прохожу по всем IView (исключая системный),
- для них определяю IAssociationViewElements,
- свойству ProjectDimensions присваиваю значение "false".
- делаю IAssociationView.Update(), IView.Update(),
- после окончания цикла - перестраиваю чертеж (IKompasDocument2D1::RebuildDocument).

В результате - отключение передачи размеров происходит только для одного вида (например, вида спереди).
В процессе исследования установил, что в остальных видах свойство IAssociationViewElements::ProjectDimensions после IAssociationView.Update(), IView.Update() - сбрасывается обратно в "true".

Каким еще способом можно отключить передачу размеров в вид, или подскажите, где у меня ошибка?
Спасибо!

P.S. Пробовал в C++ и C# - результат одинаково неудовлетворительный.

DesignЯR

Самая большая ошибка в том что Вы не приводите код. Многие форумчане уже просто устали это писать и как следствие Вы не получаете от них ни ответа ни привета.

Akew

ЦитироватьСамая большая ошибка в том что Вы не приводите код
Извиняюсь - исправляю оплошность, привожу фрагмент кода:

        private KompasObject kompas;

. . .

            IApplication kompas7 = kompas.ksGetApplication7();
            if (kompas7 == null) {
                System.Windows.Forms.MessageBox.Show("kompas7 не получен. Выход", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }

            IKompasDocument pKompasDocument = kompas7.ActiveDocument;
            if (pKompasDocument == null) {
                System.Windows.Forms.MessageBox.Show("pKompasDocument не получен. Выход", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }

            IKompasDocument2D pKompasDocument2D = (IKompasDocument2D)pKompasDocument;
            if (pKompasDocument2D == null) {
                System.Windows.Forms.MessageBox.Show("pKompasDocument2D не получен. Выход", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }

            IKompasDocument2D1 pKompasDocument2D1 = (IKompasDocument2D1)pKompasDocument2D;
            if (pKompasDocument2D1 == null) {
                System.Windows.Forms.MessageBox.Show("pKompasDocument2D1 не получен. Выход", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }

            IViewsAndLayersManager pViewsAndLayersManager = pKompasDocument2D.ViewsAndLayersManager;
            if (pViewsAndLayersManager == null ) {
                System.Windows.Forms.MessageBox.Show("pViewsAndLayersManager == null. Выход", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }

            // Получить коллекцию видов
            IViews pViews = pViewsAndLayersManager.Views;
            if (pViews==null) {
                System.Windows.Forms.MessageBox.Show("pViews == null. Выход", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); return;
            }

// Проход по видам
            for (int i_view=0; i_view<pViews.Count; ++i_view) {

                IView pView = pViews.get_ViewByNumber(i_view);
                if (pView == null) continue;

if(pView.ViewType == LtViewType.vt_System ) continue; // Пропустить системный вид

IAssociationView pAssociationView = (IAssociationView)pView;
if (pAssociationView==null) {
System.Windows.Forms.MessageBox.Show("pAssociationView == null", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); continue;
}

IAssociationViewElements pAssociationViewElements = (IAssociationViewElements)pAssociationView;
if (pAssociationViewElements==null) {
System.Windows.Forms.MessageBox.Show("pAssociationViewElements == null", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); continue;
}

pAssociationViewElements.ProjectDimensions = false;

pAssociationView.Update();
pView.Update();
            }

pKompasDocument2D1.RebuildDocument();


Попробуйте перед установкой значения сделать вид текущим, а затем установка значения и обновление вида.

Slaviation

Попробовал повторить тоже самое у себя:

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
views_and_layers_manager = kompas_document_2d.ViewsAndLayersManager
views = views_and_layers_manager.Views
for item in views:
    view = kompas_api7_module.IView(item)
    if view.ViewType  == kompas6_constants.vt_System:
        continue
    association_view_elements = kompas_api7_module.IAssociationViewElements(view)
    association_view_elements.ProjectDimensions = False
    print(view.Name, association_view_elements.ProjectDimensions)
    view.Update()
    print(view.Name, association_view_elements.ProjectDimensions)


Результат такой же:

Спереди 1 False
Спереди 1 False
Проекционный вид 2 False
Проекционный вид 2 True
Проекционный вид 3 False
Проекционный вид 3 True


Для всех проекционных видов, кроме первого ("Спереди 1") установка свойств IAssociationViewElements не работает, после вызова Update свойства сбрасываются на первоначальные значения.

DesignЯR

Если пользоваться кнопкой "Стандартные виды с модели..." тогда основной вид имеет  значение pAssociationView.ViewType=vt_Arbitary, а производные от него виды pAssociationView.ViewType=vt_Standart.
Если создавать  сначала кнопкой "Вид с модели..."( получаем pAssociationView.ViewType=vt_Arbitary) , а потом из него получать "Проекционный вид" (получаем pAssociationView.ViewType=vt_Projected), то тогда приведенный выше код работает.
Свойство ViewType в справке не описано для IAssociationView,хотя имеется. А для IView оно доступно только для чтения.
Занятно, но  если на одном листе сделать два одинаковых вида с одной модели и у обоих поставить галочку "Показывать ассоциативные размеры", то на втором виде они не отрисовываются... При запуске вышеприведенного кода два раза над главным видом появляется масштаб. Поэтому можно сделать заключение, что тут просто баг.
+ Благодарностей: 1