Разработка постпроцессоров
  • Разработка постпроцессоров
v20.0.1
Search Results for

    Show / Hide Table of Contents

    Информация о проекте (оператор 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 + " ) )");
    }
    

    Сопутствующие ссылки

    • Информация о проекте в CLData
    • Именованные параметры CLData
    • Файлы CLData (оператор CLDFile)
    • Функции и операторы доступа к CLData
    In this article