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

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

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

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

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

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

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

Как определить параметры стиля линий для каждого объекта отдельно

Автор GkmSoft, 08.08.13, 17:24:42

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

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

GkmSoft

Создается плагин для экспорта чертежей в формат 2D PDF.

При экспорте прерывистых осевых линий выполняется по ГОСТу подгонка длин длинных
штрихов, чтобы на концах отрезка линии всегда оказывались длинные штрихи.

Это работает для чертежей с настройками осевых линий БЕЗ автоопределения длин.
Например, при ограничении "не более 15 мм" в динамические массивы сегментов
линий всегда для длинного штриха передается 15.

Однако, при ВКЛЮЧЕННОМ автоопределении для всех осевых линий возвращается
один общий для всех отрезков чертежа массив  и одинаковые значение длины
длинного штриха, хотя на чертеже длины их на разных осевых линиях различные.
По-видимому, (что было проверено отладчиком), в массив записывается длина
самой последней обработанной при "автоопределении" осевой линии чертежа.
Длина длинного штриха в таком случае не связана с конкретным отрезком линии
и более того, зависит от порядка создания линий  чертежа.

ВОПРОС:
Если в режиме "не более 15 мм" (т.е. без автоопределения) имеется ясный алгоритм
корректировки штрихов, совпадающий с тем результатом, что выдает на
чертеже КОМПАС, то в режиме "автоопределения" без информации в массивах
о длинах каждого конкретного отрезка осей и без ясного алгоритма
пересчета нет никакой возможности добиться полного совпадения результата
отрисовки штрихов в чертеже КОМПАС и его экспорта в PDF формат.

Например, сейчас используем такой код для определения pattern для линий:

void Kompas2DExporter::Draw2DElement(reference rElem)  // rElem - объект, который будем обрабатывать (рисовать)
{
    if (!ExistObj(rElem))
        return;
    switch (GetObjParam(rElem, 0, 0, ALLPARAM)) // определяем тип объекта
    {
    case LINESEG_OBJ: // линия
        {
            LineSegParam lspLineParam;       // Параметры линии
            if (GetObjParam(rElem, &lspLineParam, sizeof(LineSegParam), ALLPARAM))  // Определяем параметры линии, например lspLineParam.style будет содержать стиль линии
            {               
                CurveStyleParam styleParam;         // Параметры стиля линии (цвет, толщина ...)               
                if (GetStyleParam(CURVE_STYLE, lspLineParam.style, &styleParam, sizeof(CurveStyleParam))) // определяем параметры стиля линии
                {
                    if (styleParam.curveType == 1)    // Линия является прерывистой
                    {
                        CurvePattern cPattern;                          // Структура для параметров линии
                        int nLineArrCount = GetArrayCount(styleParam.pattern);                  // Размер массива с длинами видимых и невидимых участков
                        std::vector<CurvePattern> lineLengths;                                  // Вектор с длинами видимых и невидимых участков
                        for (int i = 0; i < nLineArrCount; ++i)
                            if (GetArrayItem(styleParam.pattern, i, &cPattern, sizeof(CurvePattern)))
                                lineLengths.push_back(cPattern);
                         // теперь  lineLengths содержит информацию о pattern для стиля линии текущего объекта в STL контейнере
                         ....
                         // обработка
                    }
                 }
            }
     }
}


Все наши интересуемые объекты имеют стиль линий 3 (осевая штрих-пунктирная линия).
Стиль линий 3 - системный стиль линий.
Массив lineLengths в нашем случае всегда содержит одинаковые значения для стиля линий 3 () - так как это системный тип линии.
Для случая с ограничением длины длинного штриха - все ок, так как все объекты имеют длину длинного участка фиксированную (например 15).
Для случая с автоматическим вычислением - нам нужно заполнить массив lineLengths  для каждого конкретного объекта,
так как длина длинного участка в pattern в этом случае варьируется Компасом в зависимости от общей длины отрезка.
Как это сделать?

Надеюсь, я понятно объяснил,
Спасибо







То, есть Вы хотите сказать, что массив visibleSeg и invisibleSeg не соответствуют реальности?
+ Благодарностей: 1

GkmSoft

Да, совершенно верно. Массив не соответствует реальности только в автоматическом режиме.
В режиме ограничения длины линии - все нормально.

В автоматическом режиме проблема появляется когда в чертеже присутствует более двух отрезков с осевыми линиями.
Скажем один отрезок длинный, другой короткий.
Для длинного отрезка Компас использует одну длину (автоматически вычесленную)  штрих-пунктирной линии,
для короткого другую. Но стиль линии (3) общий для двух отрезков и возвращаемая информация в  visibleSeg и invisibleSeg одинаковая для обоих отрезков. На самом деле возвращается информация о последнем обработанном Компасом отрезке.
Как получить информацию о других отрезках пока не понятно.
Позже выложу примеры и снимки экрана

Если, можно скиньте картинки, лучше видео с отладчика, т.к. Вашей проблемой заниматься не могу, но желание помочь, есть, пока могу порекомендовать потерять 15 минут и всё переписать через интерфейсы автоматизации (ks), иногда результаты, неожиданны.
+ Благодарностей: 1

GkmSoft

в общем, использование АПИ 5 решило проблему...

еще пришлось использовать метод научного тыка...

так-нибудь потом может сброшу код