Файлы CLData (оператор CLDFile)
CLData проекта CAM разбита на файлы — по одному на технологическую операцию, плюс файлы подпрограмм УП и файл уровня проекта. Постпроцессор может обратиться к любой команде любого файла (не только текущего), чтобы заглянуть вперёд, собрать списки инструментов и т. д. В sppx это делается оператором CLDFile; в .NET — списком ICLDProject.CLDFiles объектов ICLDFile.
Доступ из sppx
Оператор CldFile предназначен для получения доступа к данным файлов CLData из кода постпроцессора. Он предоставляет информацию только для чтения, то есть может находиться только справа от оператора присваивания. Синтаксис:
CldFile.FileCount— возвращает число загруженных файлов CLData;CldFile.CurrentFile— индекс текущего файла CLData (файлы CLData индексируются начиная с номера 0);CldFile.FirstEnabledFile— индекс первого файла CLD (операции), включённого в списке на вкладке CLData;CldFile.LastEnabledFile— индекс последнего файла CLD (операции), включённого в списке на вкладке CLData;CldFile.CurrentCmd— индекс текущей команды CLData в текущем файле CLData (индексы 1-based);CldFile[<FileIndex>].Enabled— возвращает 1, когда файл номер FileIndex включён, 0 — файл отключён;CldFile[<FileIndex>].FileType— возвращает тип файла CLData: 0 — технологическая операция, 1 — подпрограмма УП, 2 — настройки проекта CAM;CldFile[<FileIndex>].IsNCSub— возвращает 1, когда файл является файлом подпрограммы УП, 0 — когда файл не является подпрограммой УП;CldFile[<FileIndex>].CmdCount— число команд в файле CLData номер FileIndex;CldFile[<FileIndex>].Cmd[<CmdIndex>]— возвращает ссылку на команду CLData с номером CmdIndex в файле с индексом FileIndex. После этой команды через точку допустимо указать любую из инструкций, определённых для оператора Cmd. Например:CldFile[<FileIndex>].Cmd[<CmdIndex>].Code— код команды CLData с номером CmdIndex;CldFile[<FileIndex>].Cmd[<CmdIndex>].Data— возвращает строковые данные команды CLData с номером CmdIndex (например, строку комментария). Если команда не содержит строковых данных, возвращает её строковое представление.CldFile[<FileIndex>].Cmd[<CmdIndex>].Data[<CldIndex>]— значение элемента массива CLD с номером CldIndex.CldFile[<FileIndex>].Cmd[<CmdIndex>].Name— имя команды CLData или параметра команды CLData;CldFile[<FileIndex>].Cmd[<CmdIndex>].Str |.Int |.Flt |.Ptr— значение параметра команды по его имени в соответствующей форме; подробнее см. раздел Именованные параметры CLData
Пример ниже печатает номера и комментарии всех инструментов, используемых в программе.
sub PrintAllTools
i: Integer
j: Integer
for i = 0 to CLDFile.FileCount-1 do begin
if (CldFile[i].Enabled>0) and (CldFile[i].IsNCSub=0) then begin
for j = 1 to CldFile[i].CmdCount do begin
! Если данная команда — "LoadTl"
if CldFile[i].Cmd[j].Code = CodeOfCmd("LoadTl") then begin
! Печать идентификатора револьверной головки
Print "RevolverID = " + CldFile[i].Cmd[j].Str["RevolverID"]
! Печать номера инструмента
Print "Tool number = ", CldFile[i].Cmd[j].Data[1]
! Печать комментария инструмента
if CldFile[i].Cmd[j+1].Code = CodeOfCmd("Comment") then
Print "Tool comment: " + CldFile[i].Cmd[j+1].Data
end
end
end
end
subend
Доступ из .NET
Список файлов достигается из объекта проекта как CLDProject.CLDFiles (ICLDFileList); текущий файл доступен напрямую как CurrentFile. Каждый элемент — это ICLDFile. Обратите внимание, что индекс команды в файле в .NET 0-based ([0..CmdCount-1]), тогда как индекс команды CLDFile[f].Cmd[c] в sppx 1-based.
ICLDFileList:
| sppx | .NET | Описание |
|---|---|---|
CldFile.FileCount |
CLDProject.CLDFiles.FileCount |
число загруженных файлов |
CldFile[f] |
CLDProject.CLDFiles[f] |
файл с индексом f |
CldFile.CurrentFile |
CurrentFile |
обрабатываемый файл |
ICLDFile:
| sppx | .NET | Описание |
|---|---|---|
CldFile[f].CmdCount |
file.CmdCount |
число команд в файле |
CldFile[f].Cmd[c] |
file.Cmd[c] / file[c] |
команда с индексом c (0-based) |
CldFile[f].Cmd[c].Code |
file.GetCommandType(c) |
тип команды с индексом c (CLDCmdType) |
CldFile[f].Enabled |
file.Enabled |
обрабатывается ли файл |
CldFile[f].FileType |
file.FileType |
тип файла (CLDFileType.TechOperation / NCSub / CAMProject) |
CldFile[f].IsNCSub |
file.FileType == CLDFileType.NCSub |
является ли файл подпрограммой УП |
| - | file.Caption / file.ID |
краткое описание / уникальный идентификатор файла |
| - | file.Index |
индекс файла в проекте |
| - | file.Project |
проект, которому принадлежит файл |
| - | file.IndexOfCmd(type, from, to) |
индекс первой команды типа в диапазоне (-1, если нет) |
| - | file.IndexOfCmdName(name, from, to) |
то же, по имени типа |
| - | file.FindCommand(type, from[, to]) |
первая команда типа в диапазоне (null, если нет) |
Тот же обход «печать всех инструментов» в .NET:
foreach... // по CLDProject.CLDFiles
for (int f = 0; f < CLDProject.CLDFiles.FileCount; f++) {
ICLDFile file = CLDProject.CLDFiles[f];
if (!file.Enabled || file.FileType == CLDFileType.NCSub)
continue;
for (int c = 0; c < file.CmdCount; c++) {
ICLDCommand command = file.Cmd[c];
if (command.CmdType == CLDCmdType.LoadTl) {
nc.OutWithN("RevolverID = " + command.Str["RevolverID"]);
nc.OutWithN("Tool number = " + command.CLD[1]);
ICLDCommand next = file.Cmd[c + 1];
if (next != null && next.CmdType == CLDCmdType.Comment)
nc.OutWithN("Tool comment: " + next.CLDataS);
}
}
}