Extracción de datos de archivos en formato DXF
La siguiente es una introducción detallada a varias primitivas leídas en este proyecto.
La extracción de información de elementos gráficos debe combinarse con el manual de referencia DXF y los archivos de la biblioteca (principalmente dl_entities.h y dl_dxf.cpp), y los datos reales requeridos se seleccionan para construir gráficos definidos por el usuario. información del elemento. Por ejemplo, al dibujar un gráfico plano bidimensional, no se requieren las coordenadas del eje Z. En este momento, solo necesita leer los valores X e Y en los datos. considerar el cambio de OCS a WCS. Sin embargo, la lectura en la dirección de estiramiento no implica la lectura de datos del archivo de la biblioteca, por lo que el archivo de la biblioteca debe modificarse en este momento, principalmente los dos archivos mencionados anteriormente (esto se presentará en detalle al dibujar un arco).
En primer lugar, puede ver la definición de cada formato de datos de información primitiva en el archivo de biblioteca dl_entities.h. La información específica representada por cada dato se puede ver en dl_dxf.cpp y su código de grupo. con el manual de referencia dxf, puedes comprender el significado de los datos y dibujarlos.
Puntos clave
void MyDXFReader::add point(const DL _ point data & data)
{
} p >
La estructura de un punto es muy simple, solo se necesitan datos.x, datos.y.
Línea
void MyDXFReader::addLine(const DL _ line data & data)
{
}
La estructura de la línea también es muy sencilla. Lee directamente el punto inicial y final para formar una línea, data.x1, data y 1 data & p>
La construcción de un círculo requiere un centro y un radio. Leer data.cx, data.cy, data.radius
Elipse
agregar elipse(const DL_EllipseData&data)
{ p>
}
La construcción de la elipse requiere el punto central, el punto del eje principal en relación con el punto central, el ángulo inicial y el ángulo final (elipse no integral), por lo que el parámetro de lectura es data.cx , data.cy, data.mx, data.my, data.angle1, data.angle2
Consejo de Investigación Agrícola
void MyDXFReader::add arc(const DL_ArcData& Data)
{
}
Los datos requeridos para el arco incluyen principalmente el valor del punto central, radio, ángulo inicial, ángulo final y dirección de estiramiento en tres direcciones. Debido a que su punto central es un valor de coordenadas representado por OCS y se usa WCS al dibujar, la transformación de coordenadas debe realizarse de acuerdo con la dirección de estiramiento. La biblioteca dxflib original no extrajo el valor de la dirección de estiramiento y simplemente asumió que se utilizó el valor predeterminado. Por lo tanto, es necesario agregar valores en el constructor DL_ArcData y en la función de lectura.
Referencia del documento
Introducción a la plataforma continental exterior y WCS
/forum.php? ver hilo&tid=667490. Highlight=trans
Conversión específica de OCS a WCS
Literatura: Pan Xiao. Investigación e implementación de un método de extracción de información de control de movimiento basado en dibujos CAD [D]. Universidad de Yanshan, 2006. (Importante)
Puede consultar el algoritmo en la literatura anterior para la conversión de coordenadas.
Polilínea y polilínea larga
añadir polilínea(const DL _ datos y datos de polilínea)
{
}
void MyDXFReader::add vertex(const DL _ vertex data & data)
{
}
En la biblioteca dxflib Elementos de polilínea y polilínea optimizada Los elementos se leen a través de estos dos métodos. Primero, agregue la polilínea (constdl_polyline data&Data) para obtener la cantidad de puntos (data.number) y banderas (data.flags), donde la cantidad de puntos representa la cantidad de puntos en addVertex y las banderas representan el cierre de la polilínea. Cabe señalar que se debe considerar la convexidad de los puntos al leer y escribir LWPOLYLINE. Si la convexidad no es 0, es necesario dibujar un arco. Si observamos el manual de referencia, podemos ver que la conversión de la plataforma continental exterior a la WCS también debería considerarse en este momento.
Referencia del documento
Convertir convexidad de polilínea en arco en un archivo DXF
/eick Andy/article/details/48317855
Dimensiones p>
Hay varias anotaciones en los archivos DXF. Según el manual de referencia DXF, se puede construir una estructura correspondiente para cada etiqueta. El dibujo de la anotación implica principalmente obtener el punto de inserción y el valor de inserción, y luego dibujar la información de la anotación en combinación con el punto de anotación.
Por ejemplo, alinear etiquetas.
void MyDXFReader::addDimAlign(const DL_dimension data&data1,
const DL_DimAlignedData&data2)
{
p>
}
Según el manual de referencia de DXF, los puntos de inserción son data1.dpx, data1.dpy, y el punto medio del valor insertado es data1.mpx, data1.mpy.. Luego se puede obtener de data2 Etiquete la información del punto data2.epx1, data2.epy1 y data2.epx2, data2.epy2, y luego dibuje la información de etiquetado de acuerdo con la referencia gráfica de etiquetado proporcionada en el manual de referencia DXF en la parte inferior de esta página. Se agregaron varios otros comentarios de esta manera.
Texto y texto de varias líneas
Para agregar información de texto, TEXTO se refiere a texto de una sola línea y TEXTOM se refiere a texto de varias líneas. En este proyecto, el contenido del texto se lee y se muestra en la ubicación especificada y no se establece el estilo de texto correspondiente. La siguiente es una breve introducción a cómo agregar varias líneas de texto.
void MyDXFReader::add mtext(const DL _ MTextData & data)
{
}
Lee principalmente datos de Insertar puntos .ipx, data.ipy y contenido de texto data.text, y luego muestra el texto cerca del punto especificado.
Inserción
Para leer el bloque insertado, es necesario almacenar todos los bloques con la ayuda de la lectura de segmentos de bloque. Al insertar un bloque, se recorren los bloques almacenados y se encuentra el bloque con el nombre correspondiente para su inserción. Dado que los tipos de primitivas en el bloque son similares a los del segmento sólido, este proyecto almacena las primitivas en el segmento sólido y el bloque respectivamente. Solo se pueden dibujar las primitivas insertadas en el bloque, mientras que se dibujarán todas las primitivas en el segmento sólido. dibujado.
void MyDXFReader::addInsert(const DL_insert data & data)
{
}
void MyDXFReader:: add block(const DL _ block data & data)
{
}
Seleccione data.name, recorra los bloques almacenados y busque el bloque que desea insertar. de bloques.