← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] fix position of text and refdes from PCAD import

 

Hello.

I rebase patches.

PS: All sizes in Kicad internal units.

> On Feb 22 2016, at 9:35 pm, Wayne Stambaugh <stambaughw@xxxxxxxxx>
wrote:  

>

> Eldar,

>

> There is something unsettling about your patch. Why are there different  
scalars applied when calculating the length of the text versus the  
height? This would suggest the PCAD file format does not use the same  
units for text height, text width, and text position. It appears to me  
that you have determined the text position and size scalars by comparing  
the KiCad output with the output of some other EDA application. If the  
PCAD units are mm, inches, mils, etc, the size and position numbers  
should be scaled to nanometers which are the units used in Pcbnew. When  
I see things like / 3, / 1.8, and / 1.4 in two consecutive lines of code  
translating coordinates, that raises a red flag.

>

> Cheers,

>

> Wayne

>

> On 2/22/2016 11:56 AM, Eldar Khayrullin wrote:  
> Hello. Patch attached.  
> P.S. need work to correct a justification of text and text size (I do)  
>  
>  
> _______________________________________________  
> Mailing list: https://launchpad.net/~kicad-developers  
> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx  
> Unsubscribe : https://launchpad.net/~kicad-developers  
> More help : https://help.launchpad.net/ListHelp  
>

>

> _______________________________________________  
Mailing list: https://launchpad.net/~kicad-developers  
Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx  
Unsubscribe : https://launchpad.net/~kicad-developers  
More help : https://help.launchpad.net/ListHelp

>From 947c6164c462c1c933147804cea6a3f1f7f5e193 Mon Sep 17 00:00:00 2001
From: Eldar Khayrullin <eldar.khayrullin@xxxxxxx>
Date: Mon, 22 Feb 2016 19:46:16 +0300
Subject: [PATCH 1/2] Fix bug #1547822 (partial): wrong position fields of text
 from PCAD import

---
 pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.cpp | 72 +++++++++++------------
 pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.h   |  3 +-
 pcbnew/pcad2kicadpcb_plugin/pcb_component.h       |  6 +-
 pcbnew/pcad2kicadpcb_plugin/pcb_module.cpp        | 24 +++++---
 pcbnew/pcad2kicadpcb_plugin/pcb_text.cpp          | 12 ++--
 5 files changed, 64 insertions(+), 53 deletions(-)

diff --git a/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.cpp b/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.cpp
index f588bbc..95876ec 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.cpp
+++ b/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.cpp
@@ -37,6 +37,9 @@
 
 namespace PCAD2KICAD {
 
+// PCAD stroke font average ratio of width to height
+const double TEXT_WIDTH_TO_HEIGHT = 0.79;
+
 wxString GetWord( wxString* aStr )
 {
     wxString result = wxEmptyString;
@@ -367,48 +370,43 @@ void SetFontProperty( XNODE*        aNode,
     }
 }
 
+int CalculateTextLengthSize( TTEXTVALUE* aText )
+{
+    return KiROUND( (double) aText->text.Len() *
+                    (double) aText->textHeight * TEXT_WIDTH_TO_HEIGHT );
+}
 
-void CorrectTextPosition( TTEXTVALUE* aValue, int aRotation )
+void CorrectTextPosition( TTEXTVALUE* aValue )
 {
-    aValue->correctedPositionX  = aValue->textPositionX;
-    aValue->correctedPositionY  = aValue->textPositionY;
-    aValue->correctedPositionY  = aValue->correctedPositionY - KiROUND(
-        (double) aValue->textHeight / 3.0 );
-    aValue->correctedPositionX = aValue->correctedPositionX +
-                                 KiROUND( ( (double) aValue->text.Len() /
-                                            1.4 ) * ( (double) aValue->textHeight / 1.8 ) );
-
-    if( aRotation == 900 )
-    {
-        aValue->correctedPositionX  = -aValue->textPositionY;
-        aValue->correctedPositionY  = aValue->textPositionX;
-        aValue->correctedPositionX  = aValue->correctedPositionX + KiROUND(
-            (double) aValue->textHeight / 3.0 );
-        aValue->correctedPositionY = aValue->correctedPositionY +
-                                     KiROUND( ( (double) aValue->text.Len() /
-                                                1.4 ) * ( (double) aValue->textHeight / 1.8 ) );
-    }
+    int cm = aValue->mirror ? -1 : 1;
+    // sizes of justify correction
+    int cl = KiROUND( (double) CalculateTextLengthSize( aValue ) / 2.0 );
+    int ch = KiROUND( (double) aValue->textHeight / 2.0 );
 
-    if( aRotation == 1800 )
-    {
-        aValue->correctedPositionX  = -aValue->textPositionX;
-        aValue->correctedPositionY  = -aValue->textPositionY;
-        aValue->correctedPositionY  = aValue->correctedPositionY +
-                                      KiROUND( (double) aValue->textHeight / 3.0 );
-        aValue->correctedPositionX = aValue->correctedPositionX -
-                                     KiROUND( ( (double) aValue->text.Len() /
-                                                1.4 ) * ( (double) aValue->textHeight / 1.8 ) );
-    }
+    aValue->correctedPositionX = aValue->textPositionX;
+    aValue->correctedPositionY = aValue->textPositionY;
 
-    if( aRotation == 2700 )
+    // standart justify (low left corner)
+    switch( aValue->textRotation )
     {
-        aValue->correctedPositionX  = aValue->textPositionY;
-        aValue->correctedPositionY  = -aValue->textPositionX;
-        aValue->correctedPositionX  = aValue->correctedPositionX +
-                                      KiROUND( (double) aValue->textHeight / 1.0 );
-        aValue->correctedPositionY = aValue->correctedPositionY -
-                                     KiROUND( ( (double) aValue->text.Len() /
-                                                3.4 ) * ( (double) aValue->textHeight / 1.8 ) );
+    case 0:
+        aValue->correctedPositionX += cl * cm;
+        aValue->correctedPositionY -= ch;
+        break;
+    case 900:
+        aValue->correctedPositionX -= ch * cm;
+        aValue->correctedPositionY -= cl;
+        break;
+    case 1800:
+        aValue->correctedPositionX -= cl * cm;
+        aValue->correctedPositionY += ch;
+        break;
+    case 2700:
+        aValue->correctedPositionX += ch * cm;
+        aValue->correctedPositionY += cl;
+        break;
+    default:
+        break;
     }
 }
 
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.h b/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.h
index 30ce190..35877c1 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.h
+++ b/pcbnew/pcad2kicadpcb_plugin/pcad2kicad_common.h
@@ -77,7 +77,8 @@ extern void         SetFontProperty( XNODE*         aNode,
                                      TTEXTVALUE*    aTextValue,
                                      wxString       aDefaultMeasurementUnit,
                                      wxString       aActualConversion );
-extern void         CorrectTextPosition( TTEXTVALUE* aValue, int aRotation );
+extern int          CalculateTextLengthSize( TTEXTVALUE* aText );
+extern void         CorrectTextPosition( TTEXTVALUE* aValue );
 
 extern XNODE*       FindNode( XNODE* aChild, wxString aTag );
 extern wxString     FindNodeGetContent( XNODE* aChild, wxString aTag );
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb_component.h b/pcbnew/pcad2kicadpcb_plugin/pcb_component.h
index 41c55ab..6088fad 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb_component.h
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb_component.h
@@ -56,11 +56,11 @@ public:
     int         m_positionX;
     int         m_positionY;
     int         m_rotation;
-    TTEXTVALUE  m_name;             // name has also privete positions, rotations nand so on....
+    TTEXTVALUE  m_name;             // name has also private positions, rotations and so on....
     wxString    m_net;
     int         m_netCode;
-    wxString    m_compRef;          // internal ussage for XL parsing
-    wxString    m_patGraphRefName;  // internal ussage for XL parsing
+    wxString    m_compRef;          // internal usage for XL parsing
+    wxString    m_patGraphRefName;  // internal usage for XL parsing
 
     PCB_COMPONENT( PCB_CALLBACKS* aCallbacks, BOARD* aBoard );
     ~PCB_COMPONENT();
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb_module.cpp b/pcbnew/pcad2kicadpcb_plugin/pcb_module.cpp
index cd4ba51..8eb66a7 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb_module.cpp
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb_module.cpp
@@ -43,6 +43,8 @@
 #include <pcb_text.h>
 #include <pcb_via.h>
 
+#include <trigo.h>
+
 namespace PCAD2KICAD {
 
 PCB_MODULE::PCB_MODULE( PCB_CALLBACKS* aCallbacks, BOARD* aBoard ) : PCB_COMPONENT( aCallbacks,
@@ -282,7 +284,7 @@ void PCB_MODULE::DoLayerContentsObjects( XNODE*                 aNode,
             propValue.Trim( false );
             propValue.Trim( true );
 
-            if( propValue == wxT( "Type" ) )
+            if( propValue == wxT( "RefDes" ) )
             {
                 tNode = FindNode( lNode, wxT( "textStyleRef" ) );
 
@@ -500,10 +502,16 @@ wxString PCB_MODULE::ModuleLayer( int aMirror )
 void PCB_MODULE::AddToBoard()
 {
     int i;
+    int r;
 
     // transform text positions
-    CorrectTextPosition( &m_name, m_rotation );
-    CorrectTextPosition( &m_value, m_rotation );
+    CorrectTextPosition( &m_name );
+    RotatePoint( &m_name.correctedPositionX, &m_name.correctedPositionY,
+                 (double) -m_rotation );
+
+    CorrectTextPosition( &m_value );
+    RotatePoint( &m_value.correctedPositionX, &m_value.correctedPositionY,
+                 (double) -m_rotation );
 
     MODULE* module = new MODULE( m_board );
     m_board->Add( module, ADD_APPEND );
@@ -528,7 +536,9 @@ void PCB_MODULE::AddToBoard()
     ref_text->SetSize( wxSize( KiROUND( m_name.textHeight / 2 ),
                                KiROUND( m_name.textHeight / 1.5 ) ) );
 
-    ref_text->SetOrientation( m_name.textRotation );
+    r = m_name.textRotation - m_rotation;
+    ref_text->SetOrientation( r );
+
     ref_text->SetThickness( m_name.textstrokeWidth );
 
     ref_text->SetMirrored( m_name.mirror );
@@ -549,7 +559,9 @@ void PCB_MODULE::AddToBoard()
     val_text->SetSize( wxSize( KiROUND( m_value.textHeight / 2 ),
                                KiROUND( m_value.textHeight / 1.5 ) ) );
 
-    val_text->SetOrientation( m_value.textRotation );
+    r = m_value.textRotation - m_rotation;
+    val_text->SetOrientation( r );
+
     val_text->SetThickness( m_value.textstrokeWidth );
 
     val_text->SetMirrored( m_value.mirror );
@@ -611,9 +623,7 @@ void PCB_MODULE::Flip()
         // Flipped
         m_KiCadLayer    = FlipLayer( m_KiCadLayer );
         m_rotation      = -m_rotation;
-        m_name.textPositionX = -m_name.textPositionX;
         m_name.mirror = m_mirror;
-        m_value.textPositionX = -m_value.textPositionX;
         m_value.mirror = m_mirror;
 
         for( i = 0; i < (int) m_moduleObjects.GetCount(); i++ )
diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb_text.cpp b/pcbnew/pcad2kicadpcb_plugin/pcb_text.cpp
index a760d0b..51f0f14 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb_text.cpp
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb_text.cpp
@@ -98,9 +98,10 @@ void PCB_TEXT::AddToModule( MODULE* aModule )
 void PCB_TEXT::AddToBoard()
 {
     // Simple, not the best, but acceptable text positioning.
-    m_name.textPositionX    = m_positionX;
-    m_name.textPositionY    = m_positionY;
-    CorrectTextPosition( &m_name, m_rotation );
+    m_name.textPositionX = m_positionX;
+    m_name.textPositionY = m_positionY;
+    m_name.textRotation = m_rotation;
+    CorrectTextPosition( &m_name );
 
     TEXTE_PCB* pcbtxt = new TEXTE_PCB( m_board );
     m_board->Add( pcbtxt, ADD_APPEND );
@@ -111,9 +112,10 @@ void PCB_TEXT::AddToBoard()
                              KiROUND( m_name.textHeight / 1.1 ) ) );
 
     pcbtxt->SetThickness( m_name.textstrokeWidth );
-    pcbtxt->SetOrientation( m_rotation );
+    pcbtxt->SetOrientation( m_name.textRotation );
 
-    pcbtxt->SetTextPosition( wxPoint( m_name.correctedPositionX, m_name.correctedPositionY ) );
+    pcbtxt->SetTextPosition( wxPoint( m_name.correctedPositionX,
+                                      m_name.correctedPositionY ) );
 
     pcbtxt->SetMirrored( m_name.mirror );
     pcbtxt->SetTimeStamp( 0 );
-- 
2.5.0

>From ae329d04e18ba7fe82b1c0b82f8a5a4b7f5fed5d Mon Sep 17 00:00:00 2001
From: Eldar Khayrullin <eldar.khayrullin@xxxxxxx>
Date: Mon, 22 Feb 2016 20:38:22 +0300
Subject: [PATCH 2/2] Fix bug #1547822: refdes and value fields are set to
 invisible in new PCAD file format

---
 pcbnew/pcad2kicadpcb_plugin/pcb.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/pcbnew/pcad2kicadpcb_plugin/pcb.cpp b/pcbnew/pcad2kicadpcb_plugin/pcb.cpp
index 41f79d2..8f5316b 100644
--- a/pcbnew/pcad2kicadpcb_plugin/pcb.cpp
+++ b/pcbnew/pcad2kicadpcb_plugin/pcb.cpp
@@ -166,7 +166,7 @@ void PCB::SetTextProperty( XNODE*   aNode, TTEXTVALUE* aTextValue,
                            wxString aActualConversion )
 {
     XNODE*      tNode, * t1Node;
-    wxString    n, pn, propValue, str;
+    wxString    n, nnew, pn, propValue, str;
 
     // aNode is pattern now
     tNode   = aNode;
@@ -199,7 +199,8 @@ void PCB::SetTextProperty( XNODE*   aNode, TTEXTVALUE* aTextValue,
                         str     = aTextValue->text;
                         str.Trim( false );
                         str.Trim( true );
-                        n       = n + wxT( ' ' ) + str; // changed in new file version.....
+                        nnew    = n; // new file version
+                        n       = n + wxT( ' ' ) + str; // old file version
                         tNode   = NULL;
                     }
                 }
@@ -219,7 +220,7 @@ void PCB::SetTextProperty( XNODE*   aNode, TTEXTVALUE* aTextValue,
         propValue.Trim( false );
         propValue.Trim( true );
 
-        if( propValue == n )
+        if( propValue == n || propValue == nnew )
             break;
 
         tNode = tNode->GetNext();
-- 
2.5.0


Follow ups

References