Pós-processador QCAD/CAM
O QCAD/CAM pode exportar desenhos CAD para diversos formatos usados em CAM (fabricação assistida por computador). Esses formatos podem ser dialetos de código G ou outros formatos completamente diferentes. Cada formato CAM suportado é definido em um arquivo de configuração (ou “pós-processador”) que é um arquivo ECMAScript (JavaScript) que implementa os detalhes do formato. Todas as configurações disponíveis são armazenadas dentro do diretório postprocessors. Novas implementações de formato podem ser adicionadas no mesmo local.
Estrutura básica
Seção intitulada “Estrutura básica”Cada arquivo de configuração contém uma classe ECMAScript com o mesmo nome do arquivo de script. Se o arquivo de script se chama MyGCode.js, a classe definida dentro do script deve se chamar MyGCode.
A classe ECMAScript deve derivar direta ou indiretamente da classe CamExporterV2, que é definida pelo QCAD/CAM. CamExporterV2 define a estrutura básica das classes de configuração de exportador CAM. Diversos métodos de CamExporterV2 são chamados para exportar o cabeçalho do arquivo, as diversas entidades do desenho CAD e o rodapé. CamExporterV2 também cuida das diversas funções do QCAD/CAM, por exemplo a compensação do raio da ferramenta, a entrada / saída, o corte de contornos internos antes dos externos, a otimização de trajetórias, etc.
CamExporterV2 não produz nada por si só, mas por si mesmo geraria um arquivo vazio. CamExporterV2 oferece um fluxo de texto (QTextStream) para escrever no arquivo exportado. Esse fluxo de texto é exposto por meio da variável membro this.stream.
Se a saída desejada for um dialeto de código G (por ex. G1 X10 Y20 para um movimento linear), a configuração pode ser derivada da configuração existente para código G chamada GCodeBase, definida no arquivo GCodeBase.js. É o caso da maioria dos controladores de máquina. Uma dessas configurações de exemplo para a saída de código G em milímetros é definida no arquivo GCodeMM.js e está disponível na interface do usuário como a configuração chamada G-Code (G41/G42) [mm].
Derivar uma configuração de GCodeBase
Seção intitulada “Derivar uma configuração de GCodeBase”Crie um arquivo com um nome único de sua escolha. Para este exemplo, chamamos a nossa nova configuração de MyGCode e a armazenamos em um arquivo com o mesmo nome, ou seja, MyGCode.js no diretório postprocessors da sua instalação do QCAD/CAM.
Você pode usar o seu editor de texto simples preferido para criar e escrever o arquivo, por exemplo o Notepad no Windows, o TextEdit no macOS ou o vim, Emacs, etc. em sistemas Linux.
MyGCode.js deve definir uma classe chamada MyGCode para ser uma configuração válida para o QCAD/CAM. Embora em ECMAScript, a rigor, não existam classes, podemos criar um conceito semelhante anexando funções ao objeto protótipo de uma função construtora. Como isso funciona exatamente foge ao escopo desta documentação. No entanto, há um modelo simples que você pode usar para todos os arquivos de configuração.
Para o nosso exemplo, a definição da classe MyGCode tem esta aparência (observe que as linhas que começam com // são comentários e não são necessárias):
// Incluir GCodeBase.js, que contém a classe 'GCodeBase',// usada como base para a nossa própria configuração:include("GCodeBase.js");
// Construtor da nossa classe:function MyGCode(documentInterface, newDocumentInterface) { // Chamar o construtor da classe base: GCodeBase.call(this, documentInterface, newDocumentInterface);}
// Derivar a nossa classe da classe GCodeBase:MyGCode.prototype = new GCodeBase();
// Nome de exibição mostrado na interface do usuário:MyGCode.displayName = "My G-Code";Agora criamos uma nova configuração totalmente funcional chamada “My G-Code”, pronta para ser usada no QCAD/CAM e que produz código G básico.
Preferências de configuração
Seção intitulada “Preferências de configuração”O construtor que definimos acima chama o construtor da nossa classe base GCodeBase. No construtor, podemos definir alguns parâmetros para a nossa configuração, como a unidade de saída desejada ou se queremos usar G41/G42 para a compensação do raio da ferramenta ou calcular o centro da trajetória da ferramenta.
Para configurar a unidade de saída (que é a unidade esperada pela sua máquina ou controlador), podemos definir a variável membro unit como Inch ou Millimeter, por exemplo:
this.unit = RS.Inch;ou
this.unit = RS.Millimeter;Outras configurações que podem ser definidas no construtor são:
| Variável | Valores possíveis | Padrão | Descrição |
|---|---|---|---|
this.outputOffsetPath |
true ou false | false | Defina como true para calcular a compensação do raio da ferramenta em vez de usar G41/G42. |
this.lineNumber |
Número | 10 | Número inicial usado para a numeração de linhas (N…). |
this.lineNumberIncrement |
Número | 10 | Incremento do número de linha de linha para linha. |
this.fileExtensions |
Array | [ "nc", "cnc" ] |
Lista de extensões de arquivo entre as quais o usuário pode escolher ao exportar por meio deste pós-processador. |
Um construtor completo pode ter esta aparência:
function MyGCode(documentInterface, newDocumentInterface) { GCodeBase.call(this, documentInterface, newDocumentInterface);
this.unit = RS.Inch; this.outputOffsetPath = true; this.lineNumber = 1; this.lineNumberIncrement = 1;}Definir a saída de código G
Seção intitulada “Definir a saída de código G”Blocos de código
Seção intitulada “Blocos de código”A saída de código G é estruturada em blocos de código que são escritos no arquivo de saída ao usar a função de exportação CAM no QCAD/CAM. Por exemplo, o primeiro bloco de código que é escrito é o bloco de código “header”. Cada bloco de código é definido em uma variável membro que o identifica pelo nome, por exemplo this.header contém o bloco de código do cabeçalho do arquivo.
Os blocos de código podem ser sobrescritos para conter qualquer código / texto. Os blocos de código normalmente contêm variáveis para gerar as coordenadas X/Y atuais, o número da linha, o avanço, etc.
Suponhamos que uma única linha seja exportada para código G. A linha é exportada com compensação do raio da ferramenta à esquerda da linha (G41). Os blocos de código escritos no arquivo de saída são os seguintes:
| Bloco de código | Descrição | Exemplo de saída |
|---|---|---|
header |
Cabeçalho da saída (sempre o primeiro bloco de código). | G21 G17 G90 G40 G49 G80 |
rapidMoveZ |
Movimento rápido para o nível de segurança. | G0 Z100 |
rapidMove |
Movimento rápido para a primeira posição do primeiro contorno (aqui o início da entrada da linha). | G0 X5 Y10 |
toolHeader |
Primeiro bloco quando uma nova ferramenta entra em ação (troca de ferramenta). | T1 |
rapidMoveZ |
Movimento rápido para baixo até o nível de aproximação (pairando sobre o material). | G0 Z5 |
firstLinearMoveZ |
Penetração no material na velocidade de mergulho. | G1 Z-5 F50 |
toolpathHeader |
Primeiro bloco de uma nova trajetória de ferramenta. | |
contourHeader |
Primeiro bloco de um novo contorno dentro de uma trajetória de ferramenta. | |
singleZPassHeader |
Cabeçalho para um único passe Z. Estamos cortando toda a profundidade em um único passe. | |
zPassFirstHeader |
Primeiro cabeçalho de um ou vários passes Z. | |
linearMoveCompensationLeft |
Movimento linear até o ponto inicial da linha ao longo da entrada, ativando a compensação do raio da ferramenta. | G41 X10 Y10 F500 |
linearMove |
Movimento linear ao longo da linha até o ponto final da linha. | X30 Y10 |
linearMoveCompensationOff |
Movimento linear para longe do ponto final ao longo da saída, desativando a compensação do raio da ferramenta. | G40 X35 Y10 |
zPassLastFooter |
Último rodapé de um ou vários passes Z. | |
singleZPassFooter |
Rodapé para um único passe Z. | |
contourFooter |
Fim do contorno. | |
toolpathFooter |
Fim da trajetória de ferramenta. | |
linearMoveZ |
Movimento para fora do material até o nível de aproximação. | Z5 |
rapidMoveZ |
Movimento rápido para o nível de segurança. | G0 Z100 |
toolFooter |
Fim para esta ferramenta. | |
footer |
Fim do programa. | M30 |
Muitos desses blocos de código normalmente ficam sem uso e não produzem nenhuma saída (bloco de código vazio).
Variáveis
Seção intitulada “Variáveis”| Variável membro | Nome da variável | Descrição |
|---|---|---|
| inputFileName | INFILENAME | Nome do arquivo de entrada (por ex. arquivo DXF). |
| inputFilePath | INFILEPATH | Nome do arquivo de entrada com o caminho completo. |
| fileName | FILENAME | Nome do arquivo de saída. |
| filePath | FILEPATH | Nome do arquivo de saída com o caminho completo. |
| dateTime | DATETIME | Data e hora da exportação. |
| lineNumber | N | Número da linha atual. |
| spindleSpeed | S | Velocidade do fuso, tipicamente em rpm. |
| feedRate | F | Avanço. |
| plungeRate | FP | Velocidade de mergulho. |
| xHomePosition | XH | Posição de referência conforme configurada na configuração CAM. |
| yHomePosition | YH | |
| zHomePosition | ZH | |
| zSafety | ZS | Nível de segurança Z para trocas de ferramenta e início / fim. |
| zClearance | ZU | Nível de aproximação Z para se aproximar do material. |
| zClearancePass | ZUP | Nível de aproximação Z entre vários passes. |
| zCuttingDepth | ZD | Nível de corte Z (total). |
| xFirstPosition | XF | Primeira posição do primeiro contorno na primeira trajetória de ferramenta. |
| yFirstPosition | YF | |
| xStartPosition | X1 | Início da entidade (ponto inicial da linha / arco). |
| yStartPosition | Y1 | |
| zStartPosition | Z1 | |
| xPosition | X | Posição de destino atual. Ponto final da linha / arco atual. |
| yPosition | Y | |
| zPosition | Z | |
| xRelPosition | XR | Posição de destino atual como coordenada relativa, em relação ao ponto inicial. |
| yRelPosition | YR | |
| zRelPosition | ZR | |
| iArcCenterInc | I | Centro do arco, em relação ao ponto inicial. |
| jArcCenterInc | J | |
| iArcCenterAbs | IA | Centro do arco, absoluto. |
| jArcCenterAbs | JA | |
| arcRadius | RADIUS | Raio do arco. |
| arcDiameter | DIAMETER | Diâmetro do arco. |
| arcSweep | SWEEP | Varredura do arco (ângulo coberto pelo arco em rad, negativo no sentido horário). |
| tool | T | Ferramenta atual. |
| toolRadius | TR | Raio da ferramenta. |
| toolDiameter | TD | Diâmetro da ferramenta. |
| toolpathOrder | TOOLPATH_ORDER | Ordem da trajetória de ferramenta na lista de trajetórias, começando com 0 para a primeira trajetória. |
| toolCalls | TOOL_CALLS | Número de vezes que esta ferramenta foi usada. |
| toolpathName | TOOLPATH_NAME | Nome da trajetória de ferramenta atual (definido pelo usuário). |
| programName | PROGRAM_NAME | Nome do programa conforme configurado pelo usuário na configuração CAM. |
| xMin | X_MIN | Extensão mínima do desenho. |
| yMin | Y_MIN | |
| zMin | Z_MIN | |
| xMax | X_MAX | Extensão máxima do desenho. |
| yMax | Y_MAX | |
| zMax | Z_MAX |
Exemplos
Seção intitulada “Exemplos”Alterar o cabeçalho e o rodapé
Seção intitulada “Alterar o cabeçalho e o rodapé”Para adicionar ou alterar códigos G ou códigos M ou outras informações no cabeçalho ou no rodapé, uma configuração pode sobrescrever as variáveis membro header e footer no construtor, por exemplo da seguinte forma:
this.header = [ "[N] G0 Z100" ];this.footer = [ "[N] G0 Z100", "[N] M30" ];I/J absolutos
Seção intitulada “I/J absolutos”Para usar valores absolutos para os valores I/J do centro dos arcos, você pode sobrescrever os blocos de código de arco da seguinte forma:
this.firstArcCWMove = "[N] G2 [X] [Y] [IA] [JA] [F]";this.arcCWMove = "[N] G2 [X] [Y] [IA] [JA] [F]";this.firstArcCCWMove = "[N] G3 [X] [Y] [IA] [JA] [F]";this.arcCCWMove = "[N] G3 [X] [Y] [IA] [JA] [F]";Arquivo de modelo do pós-processador
Seção intitulada “Arquivo de modelo do pós-processador”O QCAD/CAM mescla automaticamente um arquivo de modelo DXF com o mesmo nome do arquivo do pós-processador (se disponível) ao definir ou trocar o pós-processador. Suponhamos que o pós-processador se chame “MyGCode”, implementado em postprocessors/MyGCode.js. Crie um arquivo DXF com as definições de ferramenta em postprocessors/MyGCode.dxf. Esse arquivo pode conter definições de ferramenta, camadas padrão ou o contorno da área de superfície disponível. Observação: qualquer conteúdo visível do arquivo de modelo é automaticamente colocado em uma camada bloqueada ao mesclar, de modo que fique apenas visível, mas não selecionável.