From dfef20658c370ef28a5ad0246de275f484d6b358 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Sun, 19 Nov 2023 20:37:34 +0100 Subject: [PATCH] 3D viewer: fix incorrect display of PCB_TEXTBOX in some cases From master branch. --- 3d-viewer/3d_canvas/board_adapter.h | 4 +++ .../3d_canvas/create_3Dgraphic_brd_items.cpp | 27 +++++++++++++++++++ 3d-viewer/3d_canvas/create_layer_items.cpp | 5 +--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/3d-viewer/3d_canvas/board_adapter.h b/3d-viewer/3d_canvas/board_adapter.h index ae643570a1..490be796f7 100644 --- a/3d-viewer/3d_canvas/board_adapter.h +++ b/3d-viewer/3d_canvas/board_adapter.h @@ -49,6 +49,7 @@ #include class COLOR_SETTINGS; +class PCB_TEXTBOX; /// A type that stores a container of 2d objects for each layer id typedef std::map MAP_CONTAINER_2D_BASE; @@ -356,6 +357,9 @@ private: void addShape( const PCB_DIMENSION_BASE* aDimension, CONTAINER_2D_BASE* aDstContainer, const BOARD_ITEM* aOwner ); + void addShape( const PCB_TEXTBOX* aTextBox, CONTAINER_2D_BASE* aContainer, + const BOARD_ITEM* aOwner ); + void addSolidAreasShapes( const ZONE* aZone, CONTAINER_2D_BASE* aDstContainer, PCB_LAYER_ID aLayerId ); diff --git a/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp b/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp index 10057e6016..131fbb6d12 100644 --- a/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp +++ b/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp @@ -44,6 +44,7 @@ #include // for PCB_RENDER_SETTINGS #include #include +#include #include #include #include @@ -772,6 +773,32 @@ void BOARD_ADAPTER::addShape( const PCB_SHAPE* aShape, CONTAINER_2D_BASE* aConta } +void BOARD_ADAPTER::addShape( const PCB_TEXTBOX* aTextBox, CONTAINER_2D_BASE* aContainer, + const BOARD_ITEM* aOwner ) +{ + addText( aTextBox, aContainer, aOwner ); + + if( !aTextBox->IsBorderEnabled() ) + return; + + // We cannot use PCB_TEXTBOX::TransformShapeToPolygon because it convert the textbox + // as filled polygon even if there's no background colour. + // So for polygon, we use PCB_SHAPE::TransformShapeToPolygon + + if( aTextBox->GetShape() == SHAPE_T::RECT ) + addShape( static_cast( aTextBox ), aContainer, aOwner ); + else + { + SHAPE_POLY_SET polyList; + + aTextBox->PCB_SHAPE::TransformShapeToPolygon( polyList, UNDEFINED_LAYER, 0, + ARC_HIGH_DEF, ERROR_INSIDE ); + + ConvertPolygonToTriangles( polyList, *aContainer, m_biuTo3Dunits, *aOwner ); + } +} + + void BOARD_ADAPTER::addSolidAreasShapes( const ZONE* aZone, CONTAINER_2D_BASE* aContainer, PCB_LAYER_ID aLayerId ) { diff --git a/3d-viewer/3d_canvas/create_layer_items.cpp b/3d-viewer/3d_canvas/create_layer_items.cpp index 8af4a26b65..3fc4fb3d2a 100644 --- a/3d-viewer/3d_canvas/create_layer_items.cpp +++ b/3d-viewer/3d_canvas/create_layer_items.cpp @@ -604,9 +604,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) break; case PCB_TEXTBOX_T: - addText( static_cast( item ), layerContainer, item ); - if( static_cast( item )->IsBorderEnabled() ) - addShape( static_cast( item ), layerContainer, item ); + addShape( static_cast( item ), layerContainer, item ); break; case PCB_DIM_ALIGNED_T: @@ -924,7 +922,6 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) break; case PCB_TEXTBOX_T: - addText( static_cast( item ), layerContainer, item ); addShape( static_cast( item ), layerContainer, item ); break;