Информация о проекте (оператор Project)
Часть CLData — это данные уровня проекта: сведения, относящиеся ко всему проекту CAM, а не к отдельной операции (схема станка, детали и заготовки, установочные позиции и т. д.). Постпроцессор читает их оператором Project в sppx или объектом ICLDProject в .NET. Каталог доступных свойств проекта и их смысл описаны в разделе Информация о проекте в CLData.
Доступ из sppx
Оператор Project позволяет получить из кода постпроцессора доступ к информации о проекте CAM-системы (информации, относящейся ко всему проекту, а не к отдельным операциям), которая лежит в CLData. Синтаксис оператора следующий.
Project.Ptr|Str|Int|Flt["ParameterName"]
Здесь Project — ключевое слово для доступа к параметрам уровня проекта CAM-системы.
Ptr, Str, Int или Flt — ключевое слово, определяющее форму, в которой требуется представить значение свойства: как строку, как целое число, как число с плавающей точкой или как указатель на свойство. Подробнее об этом см. в разделе Именованные параметры CLData.
Далее в квадратных скобках следует строковый идентификатор свойства, значение которого требуется получить. Это может быть строковая константа, как показано здесь, а также любое строковое выражение или переменная.
Описание возможных свойств и их значений см. в приложении в статье Информация о проекте в CLData.
Рассмотрим пример получения информации о заготовке с помощью этого оператора.
PrintAllWorkpiece
sub PrintAllWorkpiece
i: Integer
j: Integer
px, py, pz, pv: Real
for i = 1 to Project.Ptr["Parts"].ItemCount do begin
Output "( Part" + str(i) + ".Workpiece )"
for j = 1 to Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].ItemCount do begin
Output "( Primitive " + str(j) + " )"
case Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Int["PrimitiveType"] of
0: begin !Неизвестно
Output "( Type: Unknown )"
end
1: begin !Пустая заготовка
Output "( Type: Empty workpiece )"
end
2: begin !Грани
Output "( Type: Faces )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Min.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Min.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Min.Z"]
Output "( Min point: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Max.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Max.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Max.Z"]
Output "( Max point: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
end
3: begin !Отливка
Output "( Type: Casting )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Stock"]
Output "( Stock: " + str(pv) + " )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Min.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Min.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Min.Z"]
Output "( Min point: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Max.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Max.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Box.Max.Z"]
Output "( Max point: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
end
4: begin !Параллелепипед
Output "( Type: Box )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Min.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Min.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Min.Z"]
Output "( Min point: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Max.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Max.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Max.Z"]
Output "( Max point: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
end
5: begin !Тело вращения
Output "( Type: Turn envelope )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Z"]
Output "( Origin: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Z"]
Output "( Axis: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
end
6: begin !Цилиндр
Output "( Type: Cylinder )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Z"]
Output "( Origin: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Z"]
Output "( Axis: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMin"]
Output "( Min level: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMax"]
Output "( Max level: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["ROut"]
Output "( Outer radius: " + str(pv) + " )"
end
7: begin !Труба
Output "( Type: Tube )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Z"]
Output "( Origin: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Z"]
Output "( Axis: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMin"]
Output "( Min level: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMax"]
Output "( Max level: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["ROut"]
Output "( Outer radius: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["RInn"]
Output "( Inner radius: " + str(pv) + " )"
end
8: begin !Призма
Output "( Type: Prism )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Z"]
Output "( Origin: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Z"]
Output "( Axis: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMin"]
Output "( Min level: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMax"]
Output "( Max level: " + str(pv) + " )"
end
9: begin !Многогранная призма
Output "( Type: Polygonal prism )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Origin.Z"]
Output "( Origin: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
px = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.X"]
py = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Y"]
pz = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Axis.Z"]
Output "( Axis: (" + str(px) + ", " + str(py) + ", " + str(pz) + " ) )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Int["CornerCount"]
Output "( Corner count: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["RInn"]
Output "( Inscribed radius: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["Angle"]
Output "( Angle around axis: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMin"]
Output "( Min level: " + str(pv) + " )"
pv = Project.Ptr["Parts"].Item[i].Ptr["Workpiece"].Item[j].Flt["HMax"]
Output "( Max level: " + str(pv) + " )"
end
else begin
Output "( Type: Something else )"
end
end
end
end
subend
Результатом этой подпрограммы может быть следующий текстовый блок.
Results
( Part1.Workpiece )
( Primitive 1 )
( Type: Tube )
( Origin: (0, 0, 117.5 ) )
( Axis: (0, 0, 1 ) )
( Min level: -149.5 )
( Max level: 149.5 )
( Outer radius: 66 )
( Inner radius: 29 )
( Primitive 2 )
( Type: Cylinder )
( Origin: (0, 0, 117.5 ) )
( Axis: (0, 0, 1 ) )
( Min level: -147.5 )
( Max level: 147.5 )
( Outer radius: 64 )
( Primitive 3 )
( Type: Turn envelope )
( Origin: (0, 0, 117.5 ) )
( Axis: (0, 0, 1 ) )
( Primitive 4 )
( Type: Box )
( Min point: (-64, -64, -30 ) )
( Max point: (64, 64, 265 ) )
( Primitive 5 )
( Type: Casting )
( Stock: 1 )
( Min point: (-65, -65, -31 ) )
( Max point: (65, 65, 266 ) )
( Primitive 6 )
( Type: Faces )
( Min point: (-54, -54, -30 ) )
( Max point: (54, 54, 265 ) )
( Primitive 7 )
( Type: Polygonal prism )
( Origin: (0, 0, 117.5 ) )
( Axis: (0, 1, 0 ) )
( Corner count: 6 )
( Inscribed radius: 160.786 )
( Angle around axis: 0 )
( Min level: -64 )
( Max level: 64 )
( Primitive 8 )
( Type: Empty workpiece )
Доступ из .NET
Проект доступен обработчику как объект CLDProject (ICLDProject); он также передаётся в OnStartProject / OnFinishProject. ICLDProject реализует общую модель именованных свойств, поэтому свойства проекта читаются в точности как оператором Project в sppx — CLDProject.Ptr["Parts"], CLDProject.Flt["..."], CLDProject.Arr["Parts"][i]... — с теми же именами через точку/скобки. Помимо именованных свойств он предоставляет:
.NET (ICLDProject) |
Описание |
|---|---|
CLDProject.ProjectName |
имя проекта (без пути к файлу) |
CLDProject.FilePath |
полный путь к файлу проекта (пустой, если ещё не сохранён) |
CLDProject.CLDFiles |
список файлов CLData (ICLDFileList, см. Файлы CLData) |
CLDProject.Operations |
список технологических операций |
CLDProject.CLDSub |
список подпрограмм CLD |
CLDProject.Machine |
сведения о станке (имя, группа типа, список осей) |
CLDProject.FindCommand(type, startFile, startCommand) |
найти команду типа по всему проекту |
Тот же обход заготовки в .NET обходит то же именованное дерево (обратите внимание на индексы массивов, начинающиеся с 0, — см. примечание о базе индексации в разделе Именованные параметры CLData). Полный метод, готовый к вставке в постпроцессор — вызывайте его, например, из OnStartProject:
// Выводит комментарий для каждого элемента заготовки каждой детали в управляющую программу.
public void PrintAllWorkpiece()
{
var parts = CLDProject.Arr["Parts"];
for (int i = 0; i <= parts.TopItem; i++)
{
nc.OutWithN("( Part" + (i + 1) + ".Workpiece )");
var workpiece = parts[i].Arr["Workpiece"];
for (int j = 0; j <= workpiece.TopItem; j++)
{
var wp = workpiece[j];
nc.OutWithN("( Primitive " + (j + 1) + " )");
switch (wp.Int["PrimitiveType"])
{
case 0: // Неизвестно
nc.OutWithN("( Type: Unknown )");
break;
case 1: // Пустая заготовка
nc.OutWithN("( Type: Empty workpiece )");
break;
case 2: // Грани
nc.OutWithN("( Type: Faces )");
OutPoint(wp, "Min point", "Box.Min");
OutPoint(wp, "Max point", "Box.Max");
break;
case 3: // Отливка
nc.OutWithN("( Type: Casting )");
nc.OutWithN("( Stock: " + wp.Flt["Stock"] + " )");
OutPoint(wp, "Min point", "Box.Min");
OutPoint(wp, "Max point", "Box.Max");
break;
case 4: // Параллелепипед
nc.OutWithN("( Type: Box )");
OutPoint(wp, "Min point", "Min");
OutPoint(wp, "Max point", "Max");
break;
case 5: // Тело вращения
nc.OutWithN("( Type: Turn envelope )");
OutPoint(wp, "Origin", "Origin");
OutPoint(wp, "Axis", "Axis");
break;
case 6: // Цилиндр
nc.OutWithN("( Type: Cylinder )");
OutPoint(wp, "Origin", "Origin");
OutPoint(wp, "Axis", "Axis");
nc.OutWithN("( Min level: " + wp.Flt["HMin"] + " )");
nc.OutWithN("( Max level: " + wp.Flt["HMax"] + " )");
nc.OutWithN("( Outer radius: " + wp.Flt["ROut"] + " )");
break;
case 7: // Труба
nc.OutWithN("( Type: Tube )");
OutPoint(wp, "Origin", "Origin");
OutPoint(wp, "Axis", "Axis");
nc.OutWithN("( Min level: " + wp.Flt["HMin"] + " )");
nc.OutWithN("( Max level: " + wp.Flt["HMax"] + " )");
nc.OutWithN("( Outer radius: " + wp.Flt["ROut"] + " )");
nc.OutWithN("( Inner radius: " + wp.Flt["RInn"] + " )");
break;
case 8: // Призма
nc.OutWithN("( Type: Prism )");
OutPoint(wp, "Origin", "Origin");
OutPoint(wp, "Axis", "Axis");
nc.OutWithN("( Min level: " + wp.Flt["HMin"] + " )");
nc.OutWithN("( Max level: " + wp.Flt["HMax"] + " )");
break;
case 9: // Многогранная призма
nc.OutWithN("( Type: Polygonal prism )");
OutPoint(wp, "Origin", "Origin");
OutPoint(wp, "Axis", "Axis");
nc.OutWithN("( Corner count: " + wp.Int["CornerCount"] + " )");
nc.OutWithN("( Inscribed radius: " + wp.Flt["RInn"] + " )");
nc.OutWithN("( Angle around axis: " + wp.Flt["Angle"] + " )");
nc.OutWithN("( Min level: " + wp.Flt["HMin"] + " )");
nc.OutWithN("( Max level: " + wp.Flt["HMax"] + " )");
break;
default:
nc.OutWithN("( Type: Something else )");
break;
}
}
}
}
// Читает дочерние свойства .X / .Y / .Z вложенного свойства-точки и печатает их одним комментарием.
private void OutPoint(INamedProperty item, string label, string basePath)
{
double x = item.Flt[basePath + ".X"];
double y = item.Flt[basePath + ".Y"];
double z = item.Flt[basePath + ".Z"];
nc.OutWithN("( " + label + ": (" + x + ", " + y + ", " + z + " ) )");
}