more amazing free software
This commit is contained in:
parent
70fde0fded
commit
f0ba106edb
|
@ -5,6 +5,12 @@ Started 2007-June-11
|
|||
Please add newer entries at the top, list the date and your name with
|
||||
email address.
|
||||
|
||||
2008-Feb-7 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
+pcbnew
|
||||
specctra import of *.ses, done by end of today probably.
|
||||
|
||||
|
||||
2008-Feb-6 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
+pcbnew
|
||||
|
@ -17,27 +23,27 @@ email address.
|
|||
specctra_export.cpp now supports blind/buried/microvias. Fixed how modules
|
||||
are displayed on back of board. Added a circle keepout for each copper-less
|
||||
through hole.
|
||||
|
||||
|
||||
|
||||
2008-Feb-3 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
+pcbnew
|
||||
* specctra_export.cpp was not exporting the nets correctly, now fixed.
|
||||
* Had a problem with an isolated pad modification on a single module instance
|
||||
in the context of several unmodified instances of same module, now fixed.
|
||||
* Fixed oval pads to make freerouting.net happy.
|
||||
* specctra_export.cpp was not exporting the nets correctly, now fixed.
|
||||
* Had a problem with an isolated pad modification on a single module instance
|
||||
in the context of several unmodified instances of same module, now fixed.
|
||||
* Fixed oval pads to make freerouting.net happy.
|
||||
See: http://www.freerouting.net/usren/viewtopic.php?f=3&t=317#p408
|
||||
Done with specctra export for now, will think about adding controls (by dialog)
|
||||
on the export later.
|
||||
* Beautification of a few modules.
|
||||
|
||||
* Beautification of a few modules.
|
||||
|
||||
|
||||
2008-Jan-31 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
+pcbnew:
|
||||
remove the old EDGEZONE class.
|
||||
A ZONE_CONTAINER class is used instead to handle the creation of a new zone outline
|
||||
|
||||
|
||||
|
||||
2008-Jan-29 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
|
@ -60,7 +66,7 @@ email address.
|
|||
================================================================================
|
||||
+all:
|
||||
I got a patch from Mr. Wayne Stambaugh which makes it possible to compile
|
||||
infospgm.cpp once and link the same *.o file multiple times.
|
||||
infospgm.cpp once and link the same *.o file multiple times.
|
||||
Jean-Pierre, if you not yet using CMake, you should edit your make.include
|
||||
so that infospgm.cpp is only compiled once for everything, not once per
|
||||
program. Wayne is a competent developer who contacted me about contributing.
|
||||
|
@ -75,7 +81,7 @@ email address.
|
|||
See page bottom of page 74 of the SECCTRA Design Language Reference, May 2000.
|
||||
* HISTORY_NUMBER was spelt with a zero.
|
||||
* Width was spelt as Widht
|
||||
|
||||
|
||||
|
||||
2008-Jan-25 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
|
@ -90,9 +96,9 @@ email address.
|
|||
in Dimensions/track and via menu, and placed by ctrl v.
|
||||
They are intended to connect small pitch BGA pins to the inner layer, and can be drilled by laser
|
||||
if the hole diameter is small < 0.2mm. A laser can only drill a hole between 2 adjacent layers ).
|
||||
|
||||
|
||||
** Currently use buried via for tests only, not for production **.
|
||||
|
||||
|
||||
|
||||
2008-Jan-24 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
|
@ -102,9 +108,9 @@ email address.
|
|||
* added COLLECTOR::BasePtr(), which is used in qsort. Could have used
|
||||
* std::sort() instead.
|
||||
* Wrote D_PAD::Compare()
|
||||
* updated todo.txt
|
||||
* updated todo.txt
|
||||
|
||||
|
||||
|
||||
2008-Jan-24 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
+pcbnew:
|
||||
|
@ -126,7 +132,7 @@ email address.
|
|||
Plot option in GERBER format Plot (Exclude Edge Pcb layer) modification:
|
||||
- the default is OFF (like odl pcbnew versions)
|
||||
- this setup is now save in config (is persistant)
|
||||
|
||||
|
||||
In Zone creation, now delete last created corner works.
|
||||
|
||||
2008-Jan-22 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
|
@ -154,14 +160,14 @@ email address.
|
|||
menubarpcb.cpp, and pcbframe.cpp. After dsn export, I intend to add an
|
||||
import, and a session file feedback merge. See the revised
|
||||
how-to-build-kicad.txt for the new boost c++ libraries requirement.
|
||||
|
||||
|
||||
|
||||
|
||||
2008-Jan-21 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
+eeschema:
|
||||
labels and texts display changed when rotated 180 degres:
|
||||
horizontal text are now right justified insteed of 180 degree rotated, and are readable.
|
||||
|
||||
|
||||
+pcbnew:
|
||||
bug 1874663 solved (edit a pad netname does not work very well)
|
||||
|
||||
|
@ -177,7 +183,7 @@ email address.
|
|||
+all:
|
||||
filtering small mouse moves ( < 5 pixels) when clicking.
|
||||
Starting a wire or a track is now more easily because these small moves do not start a block commnad.
|
||||
|
||||
|
||||
+pcbnew:
|
||||
rework of drill filles creation (excellon and reports)
|
||||
needed to have a clean implantation of buried vias and mainly microvia
|
||||
|
@ -239,7 +245,7 @@ email address.
|
|||
has commented out code that I tested as part of a possible new scheme to support
|
||||
custom layer names per project.
|
||||
* More specctra dsn import export work.
|
||||
|
||||
|
||||
|
||||
2008-jan-05 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
|
@ -277,7 +283,7 @@ email address.
|
|||
2007-Dec-23 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
+all
|
||||
* Because of the discussion 4 months ago about using Boost::Python, and
|
||||
* Because of the discussion 4 months ago about using Boost::Python, and
|
||||
because of an excellent boost::ptr_vector class, I want to make some of the
|
||||
boost libraries be necessary for building Kicad. These would be:
|
||||
1) boost pointer container library (immediately)
|
||||
|
@ -289,7 +295,7 @@ email address.
|
|||
fixed this.
|
||||
2) boost::python when building python in.
|
||||
* Added FIND_PACKAGE(Boost) to CMakeLists.txt
|
||||
|
||||
|
||||
|
||||
2007-Dec-22 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
|
@ -313,7 +319,7 @@ email address.
|
|||
+pcbnew:
|
||||
some changes about zones: enhanced dialog, and files reorganisation
|
||||
|
||||
|
||||
|
||||
2007-Dec-14 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
+pcbnew
|
||||
|
@ -341,11 +347,11 @@ email address.
|
|||
pcbnew/zones.cpp, see:
|
||||
http://tech.groups.yahoo.com/group/kicad-users/message/2993
|
||||
|
||||
|
||||
|
||||
2007-Dec-11 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
+all
|
||||
* Fixed hotkey table for '+' and '-' bug. The lookup table in
|
||||
* Fixed hotkey table for '+' and '-' bug. The lookup table in
|
||||
common/hotkeys_basic.cpp had bad entries for + and -. These hotkeys
|
||||
were not working on Linux.
|
||||
* Added polygon directory to Doxyfile.
|
||||
|
@ -370,13 +376,13 @@ email address.
|
|||
+pcbnew
|
||||
Very minor bug in drill map : inaccurate via shapes (I believe EXCELLON drill file has no problems)
|
||||
|
||||
|
||||
|
||||
2007-Dec-06 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
+all
|
||||
Solved zoom key command problems (under linux and windows)
|
||||
(seen http://sourceforge.net/tracker/index.php?func=detail&aid=1844960&group_id=145591&atid=762476)
|
||||
|
||||
|
||||
+pcbnew
|
||||
solved bug when loading a footprint in modedit: invisible text attribute was lost (trunk and tag)
|
||||
|
||||
|
@ -387,7 +393,7 @@ email address.
|
|||
added the D() macro to fctsys.h to ease conditional debug printf()s.
|
||||
worked on http://sourceforge.net/tracker/index.php?func=detail&aid=1844960&group_id=145591&atid=762476
|
||||
but could not resolve it in 1/2 day.
|
||||
|
||||
|
||||
|
||||
2007-Dec-4 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
|
@ -395,8 +401,8 @@ email address.
|
|||
* drc.cpp and dialog_drc.cpp update.
|
||||
Added double click support on a MARKER or unconnected DRC_ITEM in the listboxes.
|
||||
On Linux, it sometimes pops up the menu from PcbGeneralLocateAndDisplay()
|
||||
for some reason after repositioning the cursor. That is not intended, but
|
||||
after several attempts to work around it, I realized it is not so bad to
|
||||
for some reason after repositioning the cursor. That is not intended, but
|
||||
after several attempts to work around it, I realized it is not so bad to
|
||||
have this happen.
|
||||
* Added right click popup menus to the list boxes. User must first select
|
||||
the item he wants to go to, as the right click does not change the selection.
|
||||
|
@ -404,7 +410,7 @@ email address.
|
|||
out of pcbnew/find.cpp
|
||||
Done now, its ready for folks to start using it and testing it.
|
||||
|
||||
|
||||
|
||||
2007-Dec-02 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
+eeschema:
|
||||
|
@ -416,7 +422,7 @@ email address.
|
|||
================================================================================
|
||||
+pcbnew
|
||||
drc.cpp and dialog_drc.cpp intermediate update.
|
||||
|
||||
|
||||
|
||||
2007-Nov-30 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
|
@ -425,12 +431,12 @@ email address.
|
|||
* added classes DRC, REPORT_ISSUE, DRC_ITEM and rearranged drc.cpp entirely
|
||||
to comprize the DRC class. The result has finer granularity of functions
|
||||
and each is fairly well documented in English, see drc_stuff.h.
|
||||
Keeping old stuff commented out at bottom of drc.cpp until some more usage
|
||||
Keeping old stuff commented out at bottom of drc.cpp until some more usage
|
||||
and testing is done.
|
||||
* Made the DRC dialog modeless, so it can sit off to the side while the MARKER
|
||||
are inspected one by one.
|
||||
|
||||
|
||||
|
||||
2007-Nov-29 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
+pcbnew:
|
||||
|
@ -444,7 +450,7 @@ email address.
|
|||
* Moved BOARD's MARKERs from m_Drawings to vector<MARKER*> m_markers so
|
||||
they can be easily deleted and navigated to from the drc dialog.
|
||||
* deprecated the MARKER::Unlink() function.
|
||||
* Added
|
||||
* Added
|
||||
BOARD::Add( BOARD_ITEM*, int )
|
||||
BOARD::GetMARKER(int)
|
||||
BOARD::Delete( BOARD_ITEM* )
|
||||
|
@ -454,7 +460,7 @@ email address.
|
|||
* Revised BOARD::Visit() to know about BOARD::m_markers.
|
||||
* Revised pcbnew/find.cpp to know about BOARD::m_markers.
|
||||
* removed wxYield() from drc.cpp
|
||||
|
||||
|
||||
|
||||
2007-Nov-26 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
|
|
File diff suppressed because it is too large
Load Diff
1223
pcbnew/specctra.h
1223
pcbnew/specctra.h
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -3,32 +3,32 @@
|
|||
*
|
||||
* Copyright (C) 2007-2008 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||
* Copyright (C) 2007 Kicad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* This source is a complement to specctra.cpp and implements the import of
|
||||
a specctra session file (*.ses), and import of a specctra design file
|
||||
(*.dsn) file. The specification for the grammar of the specctra dsn file
|
||||
a specctra session file (*.ses), and import of a specctra design file
|
||||
(*.dsn) file. The specification for the grammar of the specctra dsn file
|
||||
used to develop this code is given here:
|
||||
http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf
|
||||
|
||||
|
||||
Also see the comments at the top of the specctra.cpp file itself.
|
||||
*/
|
||||
|
||||
|
@ -42,25 +42,30 @@ using namespace DSN;
|
|||
|
||||
void WinEDA_PcbFrame::ImportSpecctraDesign( wxCommandEvent& event )
|
||||
{
|
||||
/* @todo write this someday
|
||||
|
||||
if( !Clear_Pcb( true ) )
|
||||
return;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event )
|
||||
{
|
||||
/*
|
||||
if( GetScreen()->IsModify() )
|
||||
{
|
||||
if( !IsOK( this, _( "Board Modified: Continue ?" ) ) )
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
wxString sessionExt( wxT( ".ses" ) );
|
||||
wxString fileName = GetScreen()->m_FileName;
|
||||
wxString mask = wxT( "*" ) + sessionExt;
|
||||
|
||||
ChangeFileNameExt( fileName, sessionExt );
|
||||
|
||||
|
||||
fileName = EDA_FileSelector( _( "Merge Specctra Session file:" ),
|
||||
wxEmptyString,
|
||||
fileName,
|
||||
|
@ -69,58 +74,83 @@ void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event )
|
|||
this,
|
||||
wxFD_OPEN,
|
||||
FALSE );
|
||||
|
||||
|
||||
if( fileName == wxEmptyString )
|
||||
return;
|
||||
|
||||
|
||||
SPECCTRA_DB db;
|
||||
|
||||
setlocale( LC_NUMERIC, "C" ); // Switch the locale to standard C
|
||||
|
||||
try
|
||||
{
|
||||
setlocale( LC_NUMERIC, "C" ); // Switch the locale to standard C
|
||||
|
||||
try
|
||||
{
|
||||
db.LoadSESSION( fileName );
|
||||
db.FromSESSION( m_Pcb );
|
||||
}
|
||||
catch( IOError ioe )
|
||||
{
|
||||
setlocale( LC_NUMERIC, "" ); // Switch the locale to standard C
|
||||
setlocale( LC_NUMERIC, "" ); // revert to the current locale
|
||||
DisplayError( this, ioe.errorText );
|
||||
return;
|
||||
}
|
||||
|
||||
setlocale( LC_NUMERIC, "" ); // Switch the locale to standard C
|
||||
|
||||
setlocale( LC_NUMERIC, "" ); // revert to the current locale
|
||||
|
||||
m_SelTrackWidthBox_Changed = TRUE;
|
||||
m_SelViaSizeBox_Changed = TRUE;
|
||||
|
||||
GetScreen()->SetModify();
|
||||
m_Pcb->m_Status_Pcb = 0;
|
||||
|
||||
|
||||
Affiche_Message( wxString( _("Session file imported and merged OK.")) );
|
||||
|
||||
|
||||
DrawPanel->Refresh( TRUE );
|
||||
}
|
||||
|
||||
|
||||
|
||||
namespace DSN {
|
||||
|
||||
|
||||
static wxPoint mapPt( const POINT& aPoint, double aResolution )
|
||||
|
||||
static wxPoint mapPt( const POINT& aPoint, UNIT_RES* aResolution )
|
||||
{
|
||||
wxPoint ret;
|
||||
|
||||
double resValue = aResolution->GetValue();
|
||||
|
||||
double factor; // multiply this times units to get mils for Kicad.
|
||||
|
||||
switch( aResolution->GetEngUnits() )
|
||||
{
|
||||
default:
|
||||
case T_inch:
|
||||
factor = 0.001;
|
||||
break;
|
||||
case T_mil:
|
||||
factor = 1.0;
|
||||
break;
|
||||
case T_cm:
|
||||
factor = 2.54/1000.0;
|
||||
break;
|
||||
case T_mm:
|
||||
factor = 25.4/1000.0;
|
||||
break;
|
||||
case T_um:
|
||||
factor = 25.4;
|
||||
break;
|
||||
}
|
||||
|
||||
// the factor of 10.0 is used to convert mils to deci-mils, the units
|
||||
// used within Kicad.
|
||||
ret.x = (int) (10.0 * aPoint.x / aResolution);
|
||||
ret.y = (int) -(10.0 * aPoint.y / aResolution);
|
||||
|
||||
// used within Kicad.
|
||||
factor *= 10.0;
|
||||
|
||||
ret.x = (int) (factor * aPoint.x / resValue);
|
||||
ret.y = (int) -(factor * aPoint.y / resValue); // negate y coord
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
// no UI code in this function, throw exception to report problems to the
|
||||
|
||||
// no UI code in this function, throw exception to report problems to the
|
||||
// UI handler: void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event )
|
||||
|
||||
void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) throw( IOError )
|
||||
|
@ -129,7 +159,7 @@ void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) throw( IOError )
|
|||
|
||||
if( !session )
|
||||
ThrowIOError( _("Session file is missing the \"session\" section") );
|
||||
|
||||
|
||||
if( !session->placement )
|
||||
ThrowIOError( _("Session file is missing the \"placement\" section") );
|
||||
|
||||
|
@ -138,16 +168,16 @@ void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) throw( IOError )
|
|||
|
||||
if( !session->route->library )
|
||||
ThrowIOError( _("Session file is missing the \"library_out\" section") );
|
||||
|
||||
|
||||
// delete all the old tracks and vias
|
||||
aBoard->m_Track->DeleteStructList();
|
||||
aBoard->m_Track = NULL;
|
||||
aBoard->m_NbSegmTrack = 0;
|
||||
|
||||
aBoard->DeleteMARKERs();
|
||||
aBoard->DeleteMARKERs();
|
||||
|
||||
// Walk the PLACEMENT object's COMPONENTs list, and for each PLACE within
|
||||
// each COMPONENT, reposition and re-orient each component and put on
|
||||
// each COMPONENT, reposition and re-orient each component and put on
|
||||
// correct side of the board.
|
||||
COMPONENTS& components = session->placement->components;
|
||||
for( COMPONENTS::iterator comp=components.begin(); comp!=components.end(); ++comp )
|
||||
|
@ -156,51 +186,62 @@ void SPECCTRA_DB::FromSESSION( BOARD* aBoard ) throw( IOError )
|
|||
for( unsigned i=0; i<places.size(); ++i )
|
||||
{
|
||||
PLACE* place = &places[i]; // '&' even though places[] holds a pointer!
|
||||
|
||||
|
||||
wxString reference = CONV_FROM_UTF8( place->component_id.c_str() );
|
||||
MODULE* module = aBoard->FindModuleByReference( reference );
|
||||
if( !module )
|
||||
{
|
||||
wxString errorMsg;
|
||||
errorMsg.Printf(
|
||||
_("Session file has reference to non-existing component \"%s\""),
|
||||
ThrowIOError(
|
||||
_("Session file has 'reference' to non-existent component \"%s\""),
|
||||
reference.GetData() );
|
||||
ThrowIOError( errorMsg );
|
||||
}
|
||||
|
||||
|
||||
if( !place->hasVertex )
|
||||
continue;
|
||||
|
||||
double resolution = 100; //place->GetResolution();
|
||||
|
||||
|
||||
UNIT_RES* resolution = place->GetUnits();
|
||||
wxASSERT( resolution );
|
||||
|
||||
wxPoint newPos = mapPt( place->vertex, resolution );
|
||||
module->SetPosition( newPos );
|
||||
|
||||
|
||||
if( place->side == T_front )
|
||||
{
|
||||
// convert from degrees to tenths of degrees used in Kicad.
|
||||
int orientation = (int) (place->rotation * 10.0);
|
||||
module->SetOrientation( orientation );
|
||||
|
||||
|
||||
if( module->GetLayer() != CMP_N )
|
||||
{
|
||||
// module is on copper layer (back)
|
||||
aBoard->Change_Side_Module( module, 0 );
|
||||
}
|
||||
module->SetOrientation( orientation );
|
||||
}
|
||||
else if( place->side == T_back )
|
||||
{
|
||||
int orientation = (int) (-place->rotation * 10.0 - 1800);
|
||||
module->SetOrientation( orientation );
|
||||
|
||||
int orientation = (place->rotation + 180.0) * 10.0;
|
||||
if( module->GetLayer() != COPPER_LAYER_N )
|
||||
{
|
||||
// module is on component layer (front)
|
||||
aBoard->Change_Side_Module( module, 0 );
|
||||
}
|
||||
module->SetOrientation( orientation );
|
||||
}
|
||||
else
|
||||
{
|
||||
// as I write this, the LEXER *is* catching this, so we should never see below:
|
||||
wxFAIL_MSG( wxT("DSN::LEXER did not catch an illegal side := 'back|front'") );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Walk the NET_OUTs and create tracks and vias anew.
|
||||
// Walk the NET_OUTs and create tracks and vias anew.
|
||||
NET_OUTS& net_outs = session->route->net_outs;
|
||||
for( NET_OUTS::iterator i=net_outs.begin(); i!=net_outs.end(); ++i )
|
||||
{
|
||||
// create a track or via and position it.
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue