Расчёт стоимости
В данном разделе собраны команды и функции по расчёту стоимости мебельных изделий в проекте.
Принцип работы таков. При расчёте стоимости элемента ему приписывается Scratch-атрибут SumCost. В этом атрибуте пишем графы с названиями калькуляций и рассчитанную стоимость по графе. Графа SumCost содержит посчитанную стоимость всего элемента.
Последняя рассчитанная стоимость в Scratch-атрибуте пишется в раздел.
Перед использованием расчёта стоимости нужно задать алгоритмы расчёта для каждого из возможных FurnType'ов (типов мебельных элементов). Если этого не сделано, то берутся алгоритмы по умолчанию.
Для задания алгоритмов, FurnType можно задавать не полностью, а только значащие цифры. Поиск в словаре алгоритмов осуществляется по заданным цифрам.
Если алгоритм не только вычисляет конечную стоимость, но и хочет записать графы калькуляции, то эту информацию в атрибут пишет сам алгоритм. Конечная стоимость, в любом случае, запишется функцией. Стоимость по последнему запущенному алгоритму расчёта пишется в раздел CalcSum. Алгоритм также может записать стоимость в свой раздел со своим названием. Если пользователю этот раздел известен, он сможет ее оттуда прочитать.
Пример Sratch-атрибута SumCost
Scratch-атрибут SumChildren SumCost=494.648 CalcSum SumCost=494.648
В данном случае видно, что по алгоритму "SumChildren" посчитана стоимость в 494.648 ед. По последнему выполненному алгоритму посчитана стоимость в 494.648 ед
Встроенный расчёт стоимости[править | править код]
LOGICAL SumCost(INT <Mode>, VARIANT <Params>)
Функция рассчитывает и возвращает стоимость мебельного элемента, поссчитанную по заданному алгоритму (алгоритмам). Поведение функции зависит от режима <Mode>
. Функция возвращает 1 в случае успешного завершения и 0 в случае ошибки.
<Mode>
=1 — Задать алгоритмы расчёта
LOGICAL SumCost(1, STRING <FurnType>, {INT <AlgNum> | STRING <MacroName>})
Функция задает алгоритм расчёта стоимости мебельного элемента с типом <FurnType>
. Алгоритм задается номером <AlgNum>
или именем макропрограммы <MacroName>
. Если алгоритмы не заданы, используются алгоритмы по умолчанию. Следует иметь в виду, что некоторые алгоритмы могут использоваться только для расчёта
|
|
|
---|---|---|
|
SumChildren |
Стоимость элемента равна стоимости составляющих |
|
|
Стоимость элемента считается по графе "Калькуляция" библиотеки прототипов (пока не реализовано) |
|
MacroSumCost |
Стоимость считается по макро |
|
PanelSimple |
Стоимость панели - длины*ширина*прайс+цена составляющих |
|
PanelPrice |
Стоимость панели - длина*ширина*коэфцены*прайс+цена составляющих |
|
PanelPriceWaste |
Стоимость панели - длина*ширина*коэфцены*коэфотход*прайс+цена составляющих |
|
BandSimple |
Стоимость кромки - длина*прайс |
|
BandPrice |
Стоимость кромки - длина*коэфцены*прайс |
|
BandPriceWaste |
Стоимость кромки - длина*коэфцены*коэфотход*прайс |
|
ProfileSimple |
Стоимость профиля - длина*прайс |
|
ProfilePrice |
Стоимость профиля - длина*коэфцены*прайс |
|
ProfilePriceWaste |
Стоимость профиля - длина*коэфцены*коэфотход*прайс |
|
AccSimple |
Стоимость комплектующего - прайс |
|
AccPrice |
Стоимость комплектующего - коэфцены*прайс |
|
AccPriceWaste |
Стоимость комплектующего - коэфцены*коэфотход*прайс |
|
AccSimpleCh |
Стоимость комплектующего - прайс+цена составляющих |
|
AccPriceCh |
Стоимость комплектующего - коэфцены*прайс+цена составляющих |
|
AccPriceWasteCh |
Стоимость комплектующего - коэфцены*коэфотход*прайс+цена составляющих |
|
SumObject |
Стоимость изделия - если изделие стандартное или техника и пр - по каталогу. Иначе - по составу |
"Коэфцены" и "Коэфотход" это свойства PriceCoeff и WasteCoeff (коэффициент цены и коэффициент отхода) из Номенклатурного справочника. если эти свойства не заданы явно, то берутся значения, равные единице |
По умолчанию заданы следующие алгоритмы расчёта:
|
|
|
---|---|---|
|
Стоимость панели - длины*ширина*прайс+цена составляющих |
Стоимость панели - длины*ширина*прайс+цена составляющих |
|
ProfileSimple |
Стоимость профиля - длина*прайс |
|
AccSimpleCh |
Стоимость комплектующего - прайс+цена составляющих |
|
BandSimple |
Стоимость кромки - длина*прайс |
|
SumObject |
Стоимость изделия - если изделие стандартное или техника и пр - по каталогу. Иначе - по составу |
|
SumChildren |
Стоимость элемента равна стоимости составляющих |
<Mode>
=2 — Рассчитать стоимость
LOGICAL SumCost(2, DOUBLE VARNAME <Sum>[, OBJECT <Object>])
Функция рассчитывает стоимость мебельного элемента <Object>
(или всех мебельных элементов сцены, если параметр <Object>
не задан) по заданным алгоритмам (см. выше). Рассчитанная стоимость и калькуляция (если есть) пишется в Scratch-атрибут SumCost. Сама сумма при этом возвращается в переменную <Sum>
.
<Mode>
=3 — Вернуть рассчитанную стоимость
LOGICAL SumCost(3, DOUBLE <Sum>[, OBJECT <Object>[, STRING <Volume>]])
Функция возвращает посчитанную ранее (не пересчитывая) стоимость мебельного элемента <Object>
. Если задан параметр <Volume>
, то возвращается стоимость, посчитанная по разделу с названием <Volume>
. Иначе возвращается последняя посчитанная стоимость. Если не заданы ни <Object>
, ни <Volume>
, то возвращается последняя рассчитанная стоимость всей сцены.
Стоимость всей сцены считается как сумма последних рассчитанных стоимостей всех мебельных элементов верхнего уровня, находящихся в сцене. |
Расчёт стоимости по макро[править | править код]
Если стоимость считается по макро, то в макро в качестве параметров передаются ссылка на элемент. В переменную состояния SumCost пишется рассчитанная стоимость элемента. Если она меньше нуля, то стоимость посчитать не удалось. Также макро должен присвоить элементу атрибут SumCost с калькуляцией расчёта по общим правилам.
Пример макрорасчёта стоимости[править | править код]
//-- Расчет стоимости изделия по макро defarr pan[10]; NULLOUT=initarray(pan,0); defarr xm[6]; getpar obj; //-- Получаем объект //-- Проверяем, не панель ли это? ft=getattr(obj,"FurnType",""); if (left(ft,2)!="01") //-- Это не панель { NULLOUT=setvarinst(1,"SumCost",-1); } //-- Инициализируем панель pan[1]=obj; NULLOUT=getpan6par(1,pan); //-- Читаем материал панели pan[1]=0; NULLOUT=getpan6par(2,pan); matID=pan[1]; //-- Читаем цену материала Price=priceinfo(matID,"PRICE",0); //-- Читаем размеры панели pan[1]=0; NULLOUT=getpan6par(11,pan); if (pan[1]!=2) //-- Если панель не прямоугольная, читаем ее габариты { NULLOUT=objgab3(obj,xm); length=xm[4]-xm[1]; width=xm[5]-xm[2]; } else //-- Иначе бедем все их параметров { length=pan[2]; width=pan[3]; } //-- Очищаем структуру панели NULLOUT=getpan6par(999,pan); //-- Считаем стоимость SumCost=length*Width*Price/1000000; //-- Записываем ее в системную переменную NULLOUT=setvarinst(1,"SumCost",SumCost); exit;