Тема: коэффициенты масштабирования для AcDbPolyline::setLinetypeScale

Здравствуйте.

На чертеж загружаются объекты, одни и те же, и происходит масштабирование по границам.
Это обеспечивает наличие контрольного, всегда того же, масштаба отображения, определяемого как:

double GetViewScale()
{
    resbuf viewsize;   acedGetVar(L"viewsize",&viewsize);
    resbuf screensize; acedGetVar(L"screensize",&screensize);
        
    double height = viewsize.resval.rreal;
    double screenheight = screensize.resval.rpoint[Y];
    
    return height/screenheight;
}

В зависимости от масштаба отображения, программно задается масштаб типа линии, с помощью AcDbPolyline::setLinetypeScale.
Сама линия двойная, из двух параллельных прямых, задается так:

// в shp-файле
*216,15,RRS
1,3,50,020,2,028,4,35,02C,3,35,028,1,070,0

// в lin-файле
A,0.00000001,[RRS,mylin.shx,S=1.6],0.22,0.00000001

Масштабирование типа линии служит для того, чтобы при обновлении изображения ширина между прямыми была примерно 1 мм, по экрану.

Проблема в том, что после первой загрузки объектов на чертеж, линия отображается корректно, при этом масштабирующий коэффициент примерно равен 400, это при перезапусках программы стабильно. Также, изменение масштаба отображения колесом мыши и далее обновление изображения, не портят отображение линии, она продолжает иметь экранную ширину примерно 1 мм. Т.е. для первой загрузки весь ряд масштабирующих коэффициентов подобран корректно.
А при выполнении некоторых действий линия перестает отображаться корректно, хотя весь ряд масштабирующих коэффициентов тот же. Неверно она выглядит и при масштабировании по границам (контрольный масштаб).
При тех же масштабирущих коэффициентах, порядка 400, 2й луч линии не видно, она выглядит как одинарная.
Опытным путем выяснилось, линия может выглядеть нормально, но для этого ей нужно задавать коэффициенты гораздо меньше, примерно в диапазоне от 0.02 до 5, в зависимости от масштаба отображения.

К порче отображения линии приводят:
1) подгрузка на чертеж растрового изображения;
2) удаление всех объектов с чертежа и повторная их загрузка. Причем, после нескольких удалений и загрузок, масштабирующие коэффициенты другие, но того же порядка, т.е. точно, что нет стабильного их ухода в ноль или бесконечность при повторении удаления и загрузки объектов.

Получается, что при отрисовке линии используется не только тот коэффициент, который задается с помощью AcDbPolyline::setLinetypeScale, но и еще какой-то. Какой? Как его получить с помощью ObjectArx?
Или можно как-то по-другому добиться двойной линии?

Сложность еще и в том, что ломаная объекта может состоять из звеньев длиной до 1-2 мм, и поэтому приходится строить линию из кусочков минимальной длины.
Диапазон масштабов отображения, при котором звенья линии должны оставаться визуально состоящими из двух сплошных прямых - примерно от 0.01 до 10000.

Автокад 2010й.

(изменено: Wing, 24 мая 2013г. 16:05:51)

Re: коэффициенты масштабирования для AcDbPolyline::setLinetypeScale

Удалось накопать, что съезжает масштаб линий, в документации упоминается команда ЛМАСШТАБ и одноименная переменная. Изначально значение 1, а потом оно почему-то меняется на произвольные значение, и при установке ее обратно в 1, линия выглядит корректно.

В конце расчета добавил такой код, и все отображается корректно:

acedCommand(RTSTR, L"ЛМАСШТАБ", RTSTR, L"1", RTNONE);

А задать одноименную перменную почему-то не получилось:

resbuf rb;
rb.restype = RTREAL;
rb.resval.rreal = 1.0;
rb.rbnext = NULL;
acedSetVar( L"ЛМАСШТАБ", &rb);

Не подскажете, в чем здесь ошибка?
Спасибо.

UPD.
Применение названия переменной "LTSCALE" решило проблему.

Приношу извинения за беспокойство.

Re: коэффициенты масштабирования для AcDbPolyline::setLinetypeScale

Wing пишет:

Не подскажете, в чем здесь ошибка?

Ошибка в том, что системные переменные имеют английские имена.
В данном случае это LTSCALE.