• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Как определить номер страницы, на которой расположен объект спецификации.

Автор AlexeyEF, 13.08.13, 09:38:48

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

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

AlexeyEF

Есть задача, реализовать импорт данных из compas. При импорте спецификации, возникла проблема. Загвоздка, в странице, на которой будет расположен, при печати объект спецификации.
Как определить номер страницы, на которой расположен объект спецификации (Деталь, комплект и т.д.)?
Скиньте пример кода или наводку. Заранее спасибо.

KrissKross

Напрямую никак

Можно попробовать пройтись по всем подряд объектам спецификации

// Получаем безопасный массив интерфейсов SAFEARRAY
dynamic specObjs = ISpecificationDescription.Objects;

//Находим количество объектов
int countObj = specObjs.Count;

// Пробегаемся в цикле по каждому объекту спецификации
ISpecificationObject specObj = specObjs[i] as ISpecificationObject;

//Узнаем тип объекта если необходимо
ksSpecificationObjectTypeEnum typeObj = specObj.ObjectType;

считаем на первой странице - 29 объектов
на последующих - 32

P.S. Не забыть пробежаться по всем колонкам объекта спецификации
чтобы узнать количество строк
+ Благодарностей: 1

AlexeyEF

Спасибо.
С разбиением позиций по номерам страниц разобрался. Но возникло продолжение проблемы. Бывают странички в спецификации 2а, 2б и тд.
Если выключить автоматическую нумерацию страниц. То в режиме разметки страниц можно задать произвольный номер страницы. Как вытащить из спецификации набор страниц из спецификаций (1, 2, 3а, 3б, 4 и тд).
Если ест, что то подобное, буду благодарен. (Использую с#, но буду рад просто ключевым словам)

AlexeyEF

Получилось вытащить все поля из штампа.

// Просмотреть спецификацию
void SpcStampDecompose(KompasObject kompas, ksSpcDocument spc)
{
  var result = new Dictionary<int, IDictionary<int, string>>();
            for (int page = 1; page <= spc.ksGetSpcDocumentPagesCount(); page++)
            {
                var stamp = spc.GetStampEx(page) as ksStamp;
                if(stamp != null && stamp.ksOpenStamp() == 1)
                {
                    int numb = 0;
                    //в цикле будем брать все существующие графы
                    var arr = (ksDynamicArray)stamp.ksGetStampColumnText(ref numb);
                    ksTextItemParam item = null;
                    while (numb != 0 && arr != null)
                    {
                        var arrpLineText = (ksDynamicArray)kompas.GetDynamicArray(ldefin2d.TEXT_LINE_ARR);
                        var itemLineText = (ksTextLineParam)kompas.GetParamStruct((short)StructType2DEnum.ko_TextLineParam);
                       
                        if(itemLineText == null)
                            return;
                       
                        itemLineText.Init();

                        for (int i = 0, count = arr.ksGetArrayCount(); i < count; i++)
                        {
                            arr.ksGetArrayItem(i, itemLineText);
                            var arrpTextItem = (ksDynamicArray)itemLineText.GetTextItemArr();
                            item = (ksTextItemParam)kompas.GetParamStruct((short)StructType2DEnum.ko_TextItemParam);

                            if(item == null || arrpTextItem == null)
                                return;

                            item.Init();
                           
                            for (int j = 0, count2 = arrpTextItem.ksGetArrayCount(); j < count2; j++)
                            {
                                arrpTextItem.ksGetArrayItem(j, item);
                                if(!item.s.IsNullOrEmpty())
                                {
                                    if(!result.ContainsKey(page))
                                        result.Add(page, new Dictionary<int, string>());
                                    if(result[page].ContainsKey(numb))
                                        result[page][numb] = string.Format("{0} {1}", result[page][numb], item.s); //.Trim()
                                    else
                                        result[page].Add(numb, item.s);
                                }
                            }
                            arrpTextItem.ksDeleteArray(); //очистим массив компонент
                        }
                        //очистим массив текстовых строк
                        arrpLineText.ksDeleteArray();

                        arr.ksDeleteArray();
                        arr = (ksDynamicArray)stamp.ksGetStampColumnText(ref numb);
                    }
                    stamp.ksCloseStamp();
                }
            }
        }


Все  ячейки  в  основной  надписи  пронумерованы
page лист спецификации
Номер страницы в шапке (numb  == 7)

AlexeyEF

Забыл уточнить, что это для случая с отключенной автоматической нумерацией страниц. В случае автоматической. (1,2,3, и т.д.)