В Компас- версия 13 drawContainer.Rasters- Вываливается с ошибкой

Автор KrissKross, 14.12.16, 10:58:32

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

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

KrissKross

Ни кто не сталкивался
при обращении к drawContainer.Rasters - выскакивает исключение

            IViewsAndLayersManager _ViewsMng = doc2D.ViewsAndLayersManager;
            if (_ViewsMng == null)
            {
                return;
            }
            IViews _Views = _ViewsMng.Views;
            if (_Views == null)
            {
                return;
            }
            foreach (IView view in _Views)
            {
                IDrawingContainer _drawContainer = view as IDrawingContainer;
                try {
                IRasters _rasters = _drawContainer.Rasters;
                foreach (IRaster rast in _rasters) {}
                     }
            }

причем только в 13 версии Компаса и то не на всех компьютерах - прям мистика

Там, где вываливается попробуйте перерегистрировать Компас.

KrissKross

 :)
к сожалению нет прав доступа

т.е. Вы считаете в этом проблема - скорее всего так

Я предполагаю, Вы не показали всех данных, SP Компас, какое исключение.

KrissKross

Задача:
Найти все ссылки (имена файлов) на изображения в чертеже

Решил попробовать через API5
но что-то слишком много кода

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

как можно упростить?

Цитироватьreference obj;
            ksDocument2D doc = kompas.kompas5.ActiveDocument2D();
            ksRasterParam _rasterParam = kompas.kompas5.GetParamStruct((short)StructType2DEnum.ko_RasterParam);
            ksIterator iter = (ksIterator)kompas.kompas5.GetIterator();
            if (iter == null)
                return;
            reference pView;
           
            ksIterator ViewIterator = (ksIterator)kompas.kompas5.GetIterator();
            if (ViewIterator == null)
                return;
            if (ViewIterator.ksCreateIterator(ldefin2d.VIEW_OBJ, 0))
            {
                //создадим итератор для навигации по видам в документе
                pView = ViewIterator.ksMoveIterator("F");
                if (pView != 0)
                {
                    do
                    {
                        if (iter.ksCreateIterator(ldefin2d.RASTER_OBJ, pView))
                        {
                            //создать итератор для хождения по группе
                            obj = iter.ksMoveIterator("F");
                            //int count = 0;
                            if (doc.ksExistObj(obj) == 1)
                            {
                                do
                                {
                                    doc.ksGetObjParam(obj, _rasterParam);
                                    string image = _rasterParam.fileName;
                                    MessageBox.Show(image);
                                }
                                while (doc.ksExistObj(obj = iter.ksMoveIterator("N")) == 1);
                            }
                            iter.ksDeleteIterator();
                        }
                        pView = ViewIterator.ksMoveIterator("N");
                    }
                    while (pView != 0);
                }
                ViewIterator.ksDeleteIterator();
            }

KrissKross

и что то плохо выходит менять свойства изображения
                               ksPlacementParam _Place = _rasterParam.GetPlace();
                                    _rasterParam.Init();
                                    _rasterParam.embeded = false;
                                    _rasterParam.fileName = FileNameNew;
                                    _rasterParam.SetPlace(_Place);
                                    doc.ksSetObjParam(obj, _rasterParam);
   
_rasterParam.embeded = false;
из справки - Значение FALSE в данный момент не используется

Проблемы:
1. Изображение - получается всегда внедренным в чертеж
2. Смещается со своей позиции

Можно для API7 сразу получить массив SAFEARRAY объектов заданного типа.
AirRaster:=_DrawContainer.Objects[ksDrRaster];