Commit 23c40f7e authored by plyatov's avatar plyatov

Initial import of KiCad.

parents
/////////////////////////////////////////////////////////////////////////////
// Name: 3d_aux.cpp
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation
#pragma interface
#endif
#include "fctsys.h"
#if !wxUSE_GLCANVAS
#error Please set wxUSE_GLCANVAS to 1 in setup.h.
#endif
#include "common.h"
#include "trigo.h"
#include "bitmaps.h"
#include "3d_viewer.h"
#include "3d_struct.h"
#include "trackball.h"
/**************************************************************************/
void Struct3D_Master::Set_Object_Coords(S3D_Vertex * coord, int nbcoord )
/**************************************************************************/
{
int ii;
/* adjust object scale, rotation and offset position */
for ( ii = 0; ii < nbcoord; ii++ )
{
coord[ii].x *= m_MatScale.x;
coord[ii].y *= m_MatScale.y;
coord[ii].z *= m_MatScale.z;
/* adjust rotation */
if ( m_MatRotation.x )
RotatePoint(&coord[ii].y, &coord[ii].z,
(int)(m_MatRotation.x * 10));
if ( m_MatRotation.y )
RotatePoint(&coord[ii].z, &coord[ii].x,
(int)(m_MatRotation.y * 10));
if ( m_MatRotation.z )
RotatePoint(&coord[ii].x, &coord[ii].y,
(int)(m_MatRotation.z * 10));
/* adjust offset position (offset is given in UNIT 3D (0.1 inch) */
#define SCALE_3D_CONV (PCB_INTERNAL_UNIT/UNITS3D_TO_UNITSPCB)
coord[ii].x += m_MatPosition.x * SCALE_3D_CONV;
coord[ii].y += m_MatPosition.y * SCALE_3D_CONV;
coord[ii].z += m_MatPosition.z * SCALE_3D_CONV;
}
}
/************************************************************/
void Set_Object_Data(const S3D_Vertex * coord, int nbcoord )
/************************************************************/
{
int ii;
GLfloat ax,ay,az,bx,by,bz,nx,ny,nz,r;
/* ignore faces with less than 3 points */
if (nbcoord < 3) return;
/* calculate normal direction */
ax = coord[1].x - coord[0].x;
ay = coord[1].y - coord[0].y;
az = coord[1].z - coord[0].z;
bx = coord[nbcoord-1].x - coord[0].x;
by = coord[nbcoord-1].y - coord[0].y;
bz = coord[nbcoord-1].z - coord[0].z;
nx = ay * bz - az * by;
ny = az * bx - ax * bz;
nz = ax * by - ay * bx;
r = sqrt(nx*nx + ny*ny + nz*nz);
if (r >= 0.000001) /* avoid division by zero */
{
nx /= r; ny /= r; nz /= r;
glNormal3f(nx,ny,nz);
}
/* glBegin/glEnd */
switch (nbcoord)
{
case 3:
glBegin(GL_TRIANGLES);
break;
case 4:
glBegin(GL_QUADS);
break;
default:
glBegin(GL_POLYGON);
break;
}
/* draw polygon/triangle/quad */
for (ii = 0; ii < nbcoord; ii++)
{
glVertex3f(coord[ii].x * DataScale3D,
coord[ii].y * DataScale3D,
coord[ii].z * DataScale3D);
}
glEnd();
}
/**********************************************/
GLuint Pcb3D_GLCanvas::DisplayCubeforTest(void)
/**********************************************/
{
GLuint gllist = glGenLists( 1 );
glNewList( gllist, GL_COMPILE_AND_EXECUTE );
/* draw six faces of a cube */
glBegin(GL_QUADS);
glNormal3f( 0.0F, 0.0F, 1.0F);
glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f(-0.5F, 0.5F, 0.5F);
glVertex3f(-0.5F,-0.5F, 0.5F); glVertex3f( 0.5F,-0.5F, 0.5F);
glNormal3f( 0.0F, 0.0F,-1.0F);
glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f(-0.5F, 0.5F,-0.5F);
glVertex3f( 0.5F, 0.5F,-0.5F); glVertex3f( 0.5F,-0.5F,-0.5F);
glNormal3f( 0.0F, 1.0F, 0.0F);
glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f( 0.5F, 0.5F,-0.5F);
glVertex3f(-0.5F, 0.5F,-0.5F); glVertex3f(-0.5F, 0.5F, 0.5F);
glNormal3f( 0.0F,-1.0F, 0.0F);
glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f( 0.5F,-0.5F,-0.5F);
glVertex3f( 0.5F,-0.5F, 0.5F); glVertex3f(-0.5F,-0.5F, 0.5F);
glNormal3f( 1.0F, 0.0F, 0.0F);
glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f( 0.5F,-0.5F, 0.5F);
glVertex3f( 0.5F,-0.5F,-0.5F); glVertex3f( 0.5F, 0.5F,-0.5F);
glNormal3f(-1.0F, 0.0F, 0.0F);
glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f(-0.5F,-0.5F, 0.5F);
glVertex3f(-0.5F, 0.5F, 0.5F); glVertex3f(-0.5F, 0.5F,-0.5F);
glEnd();
glEndList();
return gllist;
}
/**********************/
/* class Info_3D_Visu */
/**********************/
/* Constructor */
Info_3D_Visu::Info_3D_Visu(void)
{
int ii;
m_Beginx = m_Beginy = 0.0; /* position of mouse */
m_Zoom = 1.0; /* field of view in degrees */
trackball( m_Quat, 0.0, 0.0, 0.0, 0.0 );
for ( ii = 0; ii < 4; ii++ ) m_Rot[ii] = 0.0;
m_Layers = 1;
m_BoardSettings = NULL;
}
Info_3D_Visu::~Info_3D_Visu(void)
{
}
/*****************************************************************/
/* Classe pour afficher et editer un Vertex (triplet de valeurs),*/
/* en INCHES ou MM ou sans unites */
/*****************************************************************/
WinEDA_VertexCtrl::WinEDA_VertexCtrl(wxWindow *parent, const wxString & title,
wxBoxSizer * BoxSizer,
int units, int internal_unit)
{
wxString text;
wxStaticText * msgtitle;
m_Units = units;
m_Internal_Unit = internal_unit;
if ( title.IsEmpty() ) text = _("Vertex ");
else text = title;
text += ReturnUnitSymbol(units);
msgtitle = new wxStaticText(parent, -1, text, wxDefaultPosition, wxSize(-1,-1), 0 );
BoxSizer->Add(msgtitle, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxBOTTOM|wxADJUST_MINSIZE);
wxFlexGridSizer * GridSizer = new wxFlexGridSizer(3, 2, 0, 0);
BoxSizer->Add(GridSizer, 0, wxGROW|wxALL, 5);
msgtitle = new wxStaticText(parent, -1, wxT("X:"));
GridSizer->Add(msgtitle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
m_XValueCtrl = new wxTextCtrl(parent, -1, wxEmptyString, wxDefaultPosition, wxSize(-1,-1), 0 );
GridSizer->Add(m_XValueCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5);
msgtitle = new wxStaticText(parent, -1, wxT("Y:"), wxDefaultPosition, wxSize(-1,-1), 0 );
GridSizer->Add(msgtitle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
m_YValueCtrl = new wxTextCtrl(parent, -1, wxEmptyString, wxDefaultPosition, wxSize(-1,-1), 0 );
GridSizer->Add(m_YValueCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5);
msgtitle = new wxStaticText(parent, -1, wxT("Z:"), wxDefaultPosition, wxSize(-1,-1), 0 );
GridSizer->Add(msgtitle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5);
m_ZValueCtrl = new wxTextCtrl(parent, -1, wxEmptyString, wxDefaultPosition, wxSize(-1,-1), 0 );
GridSizer->Add(m_ZValueCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5);
}
WinEDA_VertexCtrl::~WinEDA_VertexCtrl(void)
{
}
/*******************************************/
S3D_Vertex WinEDA_VertexCtrl::GetValue(void)
/*******************************************/
/* Retourne (en unites internes) les coordonnes entrees (en unites utilisateur)
*/
{
S3D_Vertex value;
double dtmp;
m_XValueCtrl->GetValue().ToDouble(&dtmp);
value.x = dtmp;
m_YValueCtrl->GetValue().ToDouble(&dtmp);
value.y = dtmp;
m_ZValueCtrl->GetValue().ToDouble(&dtmp);
value.z = dtmp;
return value;
}
/**************************************************/
void WinEDA_VertexCtrl::SetValue(S3D_Vertex vertex)
/**************************************************/
{
wxString text;
text.Printf( wxT("%f"), vertex.x);
m_XValueCtrl->Clear();
m_XValueCtrl->AppendText(text);
text.Printf(wxT("%f"), vertex.y);
m_YValueCtrl->Clear();
m_YValueCtrl->AppendText(text);
text.Printf(wxT("%f"), vertex.z);
m_ZValueCtrl->Clear();
m_ZValueCtrl->AppendText(text);
}
/*****************************************/
void WinEDA_VertexCtrl::Enable(bool onoff)
/*****************************************/
{
m_XValueCtrl->Enable(onoff);
m_YValueCtrl->Enable(onoff);
m_ZValueCtrl->Enable(onoff);
}
This diff is collapsed.
/////////////////////////////////////////////////////////////////////////////
// Name: 3d_class.cpp
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation
#pragma interface
#endif
#include "fctsys.h"
#include "common.h"
#include "3d_struct.h"
#include "3d_viewer.h"
/****************************/
S3D_Vertex::S3D_Vertex(void)
/****************************/
{
x = y = z = 0.0;
}
/**************************************************************************/
S3D_Material::S3D_Material(Struct3D_Master * father, const wxString & name):
EDA_BaseStruct( father, -1)
/**************************************************************************/
{
m_DiffuseColor.x = m_DiffuseColor.y = m_DiffuseColor.z = 1.0;
m_SpecularColor.x = m_SpecularColor.y = m_SpecularColor.z = 1.0;
m_AmbientIntensity = 1.0;
m_Transparency = 0.0;
m_Shininess = 1.0;
m_Name = name;
}
/***********************************/
void S3D_Material::SetMaterial(void)
/***********************************/
{
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glColor4f(m_DiffuseColor.x * m_AmbientIntensity,
m_DiffuseColor.y * m_AmbientIntensity,
m_DiffuseColor.z * m_AmbientIntensity,
1.0 - m_Transparency );
#if 0
glColorMaterial(GL_FRONT_AND_BACK,GL_SPECULAR);
glColor3f(m_SpecularColor.x, m_SpecularColor.y,m_SpecularColor.z);
#endif
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
}
/****************************************************/
void Struct3D_Master::Copy(Struct3D_Master * pattern)
/****************************************************/
{
m_Shape3DName = pattern->m_Shape3DName;
m_MatScale = pattern->m_MatScale;
m_MatRotation = pattern->m_MatRotation;
m_MatPosition = pattern->m_MatPosition;
m_3D_Drawings = NULL;
m_Materials = NULL;
}
/***************************************************************/
Struct3D_Master::Struct3D_Master(EDA_BaseStruct * StructFather):
EDA_BaseStruct( StructFather, -1)
/***************************************************************/
{
m_MatScale.x = m_MatScale.y = m_MatScale.z = 1.0;
m_3D_Drawings = NULL;
m_Materials = NULL;
}
/***************************************/
Struct3D_Master:: ~Struct3D_Master(void)
/***************************************/
{
Struct3D_Shape * next;
S3D_Material * nextmat;
for( ; m_3D_Drawings != NULL; m_3D_Drawings = next )
{
next = (Struct3D_Shape *) m_3D_Drawings->Pnext;
delete m_3D_Drawings;
}
for( ; m_Materials != NULL; m_Materials = nextmat )
{
nextmat = (S3D_Material *) m_Materials->Pnext;
delete m_Materials;
}
}
/***************************************************************/
Struct3D_Shape::Struct3D_Shape(EDA_BaseStruct * StructFather):
EDA_BaseStruct( StructFather, -1)
/***************************************************************/
{
m_3D_Coord = NULL;
m_3D_CoordIndex = NULL;
m_3D_Points = 0;
}
/***************************************/
Struct3D_Shape:: ~Struct3D_Shape(void)
/***************************************/
{
delete m_3D_Coord;
delete m_3D_CoordIndex;
}
This diff is collapsed.
/////////////////////////////////////////////////////////////////////////////
// Name: 3d_frame.cpp
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation
#pragma interface
#endif
#include "fctsys.h"
#include <wx/colordlg.h>
#if !wxUSE_GLCANVAS
#error Please set wxUSE_GLCANVAS to 1 in setup.h.
#endif
#include "bitmaps.h"
#include "id.h"
#define VIEWER_MAIN
#include "3d_viewer.h"
#include "trackball.h"
BEGIN_EVENT_TABLE(WinEDA3D_DrawFrame, wxFrame)
EVT_TOOL_RANGE(ID_ZOOM_PLUS_BUTT, ID_ZOOM_PAGE_BUTT,
WinEDA3D_DrawFrame::Process_Zoom)
EVT_TOOL_RANGE(ID_START_COMMAND_3D, ID_END_COMMAND_3D,
WinEDA3D_DrawFrame::Process_Special_Functions)
EVT_MENU(wxID_EXIT, WinEDA3D_DrawFrame::Exit3DFrame)
EVT_MENU(ID_MENU_SCREENCOPY_PNG, WinEDA3D_DrawFrame::Process_Special_Functions)
EVT_MENU(ID_MENU_SCREENCOPY_JPEG, WinEDA3D_DrawFrame::Process_Special_Functions)
EVT_CLOSE(WinEDA3D_DrawFrame::OnCloseWindow)
END_EVENT_TABLE()
/*******************************************************************/
WinEDA3D_DrawFrame::WinEDA3D_DrawFrame(WinEDA_BasePcbFrame * parent,
WinEDA_App *app_parent, const wxString& title ):
wxFrame(parent, DISPLAY3D_FRAME, title,
wxPoint(-1,-1), wxSize(-1,-1) )
/*******************************************************************/
{
m_FrameName = wxT("Frame3D");
m_Canvas = NULL;
m_Parent = parent;
m_ParentAppl = app_parent;
m_HToolBar = NULL;
m_VToolBar = NULL;
m_InternalUnits = 10000; // Unites internes = 1/10000 inch
// Give it an icon
SetIcon(wxICON(icon_w3d));
GetSettings();
SetSize(m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y);
// Create the status line
int dims[5] = { -1, 100, 100, 100, 140};
CreateStatusBar(5);
SetStatusWidths(5,dims);
ReCreateMenuBar();
ReCreateHToolbar();
// ReCreateAuxiliaryToolbar();
ReCreateVToolbar();
// Make a Pcb3D_GLCanvas
m_Canvas = new Pcb3D_GLCanvas(this, -1, gl_attrib );
/* init OpenGL once */
m_Canvas->InitGL();
}
/***********************************************************/
void WinEDA3D_DrawFrame::Exit3DFrame(wxCommandEvent& event)
/***********************************************************/
{
Close(TRUE);
}
/***********************************************************/
void WinEDA3D_DrawFrame::OnCloseWindow(wxCloseEvent & Event)
/***********************************************************/
{
SaveSettings();
if ( m_Parent )
{
m_Parent->m_Draw3DFrame = NULL;
}
Destroy();
}
/******************************************/
void WinEDA3D_DrawFrame::GetSettings(void)
/******************************************/
{
wxString text;
wxConfig * Config = m_ParentAppl->m_EDA_Config; // Current config used by application
if( m_ParentAppl->m_EDA_Config )
{
text = m_FrameName + wxT("Pos_x");
Config->Read(text, &m_FramePos.x);
text = m_FrameName + wxT("Pos_y");
Config->Read(text, &m_FramePos.y);
text = m_FrameName + wxT("Size_x");
Config->Read(text, &m_FrameSize.x, 600);
text = m_FrameName + wxT("Size_y");
Config->Read(text, &m_FrameSize.y, 400);
Config->Read(wxT("BgColor_Red"), &g_Parm_3D_Visu.m_BgColor.m_Red, 0.0);
Config->Read(wxT("BgColor_Green"), &g_Parm_3D_Visu.m_BgColor.m_Green, 0.0);
Config->Read(wxT("BgColor_Blue"), &g_Parm_3D_Visu.m_BgColor.m_Blue, 0.0);
}
#ifdef __WXMAC__
// for macOSX, the window must be below system (macOSX) toolbar
if ( m_FramePos.y < GetMBarHeight() ) m_FramePos.y = GetMBarHeight();
#endif
}
/*******************************************/
void WinEDA3D_DrawFrame::SaveSettings(void)
/*******************************************/
{
wxString text;
wxConfig * Config = m_ParentAppl->m_EDA_Config; // Current config used by application
if( ! Config ) return;
Config->Write(wxT("BgColor_Red"), g_Parm_3D_Visu.m_BgColor.m_Red);
Config->Write(wxT("BgColor_Green"), g_Parm_3D_Visu.m_BgColor.m_Green);
Config->Write(wxT("BgColor_Blue"), g_Parm_3D_Visu.m_BgColor.m_Blue);
if( IsIconized() ) return;
m_FrameSize = GetSize();
m_FramePos = GetPosition();
text = m_FrameName + wxT("Pos_x");
Config->Write(text, (long)m_FramePos.x);
text = m_FrameName + wxT("Pos_y");
Config->Write(text, (long)m_FramePos.y);
text = m_FrameName + wxT("Size_x");
Config->Write(text, (long)m_FrameSize.x);
text = m_FrameName + wxT("Size_y");
Config->Write(text, (long)m_FrameSize.y);
}
/***********************************************************/
void WinEDA3D_DrawFrame::Process_Zoom(wxCommandEvent& event)
/***********************************************************/
{
int ii;
switch(event.GetId())
{
case ID_ZOOM_PAGE_BUTT:
for ( ii = 0; ii < 4; ii++ ) g_Parm_3D_Visu.m_Rot[ii] = 0.0;
g_Parm_3D_Visu.m_Zoom = 1.0;
g_Draw3d_dx = g_Draw3d_dy = 0;
trackball(g_Parm_3D_Visu.m_Quat, 0.0, 0.0, 0.0, 0.0 );
break;
case ID_ZOOM_PLUS_BUTT:
g_Parm_3D_Visu.m_Zoom /= 1.2;
if ( g_Parm_3D_Visu.m_Zoom <= 0.01)
g_Parm_3D_Visu.m_Zoom = 0.01;
break;
case ID_ZOOM_MOINS_BUTT:
g_Parm_3D_Visu.m_Zoom *= 1.2;
break;
case ID_ZOOM_REDRAW_BUTT:
break;
default:
return;
}
m_Canvas->DisplayStatus();
m_Canvas->Refresh(FALSE);
}
/************************************************************************/
void WinEDA3D_DrawFrame::OnLeftClick(wxDC * DC, const wxPoint& MousePos)
/************************************************************************/
{
}
/*******************************************************************************/
void WinEDA3D_DrawFrame::OnRightClick(const wxPoint& MousePos, wxMenu * PopMenu)
/*******************************************************************************/
{
}
/************************************/
int WinEDA3D_DrawFrame::BestZoom(void)
/************************************/
// Retourne le meilleur zoom
{
return 1;
}
/*******************************************************************/
void WinEDA3D_DrawFrame::RedrawActiveWindow(wxDC * DC, bool EraseBg)
/*******************************************************************/
{
}
/************************************************************************/
void WinEDA3D_DrawFrame::Process_Special_Functions(wxCommandEvent& event)
/************************************************************************/
{
#define ROT_ANGLE 10.0
switch(event.GetId())
{
case ID_RELOAD3D_BOARD:
NewDisplay();
break;
case ID_ROTATE3D_X_POS:
g_Parm_3D_Visu.m_ROTX += ROT_ANGLE;
break;
case ID_ROTATE3D_X_NEG:
g_Parm_3D_Visu.m_ROTX -= ROT_ANGLE;
break;
case ID_ROTATE3D_Y_POS:
g_Parm_3D_Visu.m_ROTY += ROT_ANGLE;
break;
case ID_ROTATE3D_Y_NEG:
g_Parm_3D_Visu.m_ROTY -= ROT_ANGLE;
break;
case ID_ROTATE3D_Z_POS:
g_Parm_3D_Visu.m_ROTZ += ROT_ANGLE;
break;
case ID_ROTATE3D_Z_NEG:
g_Parm_3D_Visu.m_ROTZ -= ROT_ANGLE;
break;
case ID_MOVE3D_LEFT:
m_Canvas->SetView3D(WXK_LEFT);
return;
case ID_MOVE3D_RIGHT:
m_Canvas->SetView3D(WXK_RIGHT);
return;
case ID_MOVE3D_UP:
m_Canvas->SetView3D(WXK_UP);
return;
case ID_MOVE3D_DOWN:
m_Canvas->SetView3D(WXK_DOWN);
return;
case ID_TOOL_SCREENCOPY_TOCLIBBOARD:
case ID_MENU_SCREENCOPY_PNG:
case ID_MENU_SCREENCOPY_JPEG:
m_Canvas->TakeScreenshot(event);
break;
case ID_MENU3D_BGCOLOR_SELECTION:
Set3DBgColor();
return;
default:
wxMessageBox(
wxT("WinEDA3D_DrawFrame::Process_Special_Functions() error: unknown command"));
return;
}
m_Canvas->DisplayStatus();
m_Canvas->Refresh(FALSE);
}
/*****************************************/
void WinEDA3D_DrawFrame::NewDisplay(void)
/*****************************************/
{
m_Canvas->ClearLists();
m_Canvas->InitGL();
m_Canvas->DisplayStatus();
m_Canvas->Refresh(FALSE);
}
/******************************************/
void WinEDA3D_DrawFrame::Set3DBgColor(void)
/******************************************/
/* called to set the background color of the 3D scene
*/
{
S3D_Color color;
wxColour newcolor, oldcolor;
oldcolor.Set((int) round(g_Parm_3D_Visu.m_BgColor.m_Red*255),
(int) round(g_Parm_3D_Visu.m_BgColor.m_Green*255),
(int) round(g_Parm_3D_Visu.m_BgColor.m_Blue*255));
newcolor = wxGetColourFromUser(this, oldcolor);
if ( newcolor != oldcolor )
{
g_Parm_3D_Visu.m_BgColor.m_Red = (double) newcolor.Red() / 255.0;
g_Parm_3D_Visu.m_BgColor.m_Green = (double) newcolor.Green() / 255.0;
g_Parm_3D_Visu.m_BgColor.m_Blue = (double) newcolor.Blue() / 255.0;
NewDisplay();
}
}
This diff is collapsed.
/********************************************************/
/* 3d_struct.h : definition des structures de donnees */
/* pour la representation 3D des modules */
/********************************************************/
#ifndef STRUCT_3D_H
#define STRUCT_3D_H
#include "base_struct.h"
/* 3D modeler units -> PCB units conversion scale:
1 "3D unit modeler" = 1 unit wings3d = 2,54 mm = 0.1 inch */
#define UNITS3D_TO_UNITSPCB 1000
class Struct3D_Master;
class Struct3D_Shape;
class S3D_Color /* This is a 3D color (R, G, G) 3 floats range 0 to 1.0*/
{
public:
double m_Red, m_Green, m_Blue;
public:
S3D_Color(void)
{
m_Red = m_Green = m_Blue = 0;
}
};
class S3D_Vertex /* This is a 3D coordinate (3 float numbers: x,y,z coordinates)*/
{
public:
double x, y, z;
public:
S3D_Vertex(void);
};
class S3D_Material: public EDA_BaseStruct /* openGL "material" data*/
{
public:
wxString m_Name;
S3D_Vertex m_DiffuseColor;
S3D_Vertex m_EmissiveColor;
S3D_Vertex m_SpecularColor;
float m_AmbientIntensity;
float m_Transparency;
float m_Shininess;
public:
S3D_Material(Struct3D_Master * father, const wxString & name);
void SetMaterial(void);
};
/*******************************************/
class Struct3D_Master: public EDA_BaseStruct
/*******************************************/
/* Master structure for a 3D item description */
{
public:
wxString m_Shape3DName; /* 3D shape name in 3D library */
S3D_Vertex m_MatScale;
S3D_Vertex m_MatRotation;
S3D_Vertex m_MatPosition;
Struct3D_Shape * m_3D_Drawings;
S3D_Material *m_Materials;
public:
Struct3D_Master(EDA_BaseStruct * StructFather);
~Struct3D_Master(void);
void Copy(Struct3D_Master * pattern);
int ReadData(void);
int ReadMaterial(FILE * file, int *LineNum);
int ReadChildren(FILE * file, int *LineNum);
int ReadShape(FILE * file, int *LineNum);
int ReadAppearance(FILE * file, int *LineNum);
int ReadGeometry(FILE * file, int *LineNum);
void Set_Object_Coords(S3D_Vertex * coord, int nbcoord );
};
/*********************************************/
class Struct3D_Shape: public EDA_BaseStruct
/*********************************************/
/* decrit une forme complexe 3D */
{
public:
S3D_Vertex * m_3D_Coord;
int * m_3D_CoordIndex;
int m_3D_Points;
public:
Struct3D_Shape(EDA_BaseStruct * StructFather);
~Struct3D_Shape(void);
int ReadData(FILE * file, int *LineNum);
};
/*****************************************************************/
/* Classe pour afficher et editer un Vertex (triplet de valeurs),*/
/* en INCHES ou MM ou sans unites */
/*****************************************************************/
/* internal_unit is the internal unit number by inch:
- 1000 for EESchema
- 10000 for PcbNew
*/
class WinEDA_VertexCtrl
{
private:
int m_Units;
int m_Internal_Unit;
wxTextCtrl * m_XValueCtrl, * m_YValueCtrl, * m_ZValueCtrl;
wxStaticText * m_Text;
public:
// Constructor and destructor
WinEDA_VertexCtrl(wxWindow *parent, const wxString & title,
wxBoxSizer * BoxSizer,
int units, int internal_unit);
~WinEDA_VertexCtrl(void);
S3D_Vertex GetValue(void);
void SetValue(S3D_Vertex vertex);
void Enable(bool enbl);
void SetToolTip(const wxString & text);
};
#endif /* STRUCT_3D_H */
/*******************************************************************/
/* 3d_toolbar.cpp: construction des tool bars de la frame visu 3d */
/*******************************************************************/
#include "fctsys.h"
#include "macros.h"
#include "bitmaps3d.h"
#include "bitmaps.h"
#include "id.h"
#define BITMAP wxBitmap
#include "3d_viewer.h"
/*********************************************/
void WinEDA3D_DrawFrame::ReCreateHToolbar(void)
/*********************************************/
{
if ( m_HToolBar != NULL )
{ // simple mise a jour de la liste des fichiers anciens
SetToolbars();
return;
}
m_HToolBar = new WinEDA_Toolbar(TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE);
SetToolBar(m_HToolBar);
// Set up toolbar
m_HToolBar->AddTool(ID_RELOAD3D_BOARD, wxEmptyString, BITMAP(import3d_xpm),
_("Reload board"));
#ifdef __WINDOWS__ // do not work properly under linux
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_TOOL_SCREENCOPY_TOCLIBBOARD, wxEmptyString, BITMAP(copy_button),
_("Copy 3D Image to Clipboard"));
#endif
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_ZOOM_PLUS_BUTT, wxEmptyString, BITMAP(zoom_in_xpm),
_("zoom + (F1)"));
m_HToolBar->AddTool(ID_ZOOM_MOINS_BUTT, wxEmptyString, BITMAP(zoom_out_xpm),
_("zoom - (F2)"));
m_HToolBar->AddTool(ID_ZOOM_REDRAW_BUTT, wxEmptyString, BITMAP(repaint_xpm),
_("redraw (F3)"));
m_HToolBar->AddTool(ID_ZOOM_PAGE_BUTT, wxEmptyString, BITMAP(zoom_optimal_xpm),
_("auto zoom"));
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_ROTATE3D_X_POS, wxEmptyString, BITMAP(rotate_pos_X_xpm),
_("Rotate X ->") );
m_HToolBar->AddTool(ID_ROTATE3D_X_NEG, wxEmptyString, BITMAP(rotate_neg_X_xpm),
_("Rotate X <-") );
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_ROTATE3D_Y_POS, wxEmptyString, BITMAP(rotate_pos_Y_xpm),
_("Rotate Y ->") );
m_HToolBar->AddTool(ID_ROTATE3D_Y_NEG, wxEmptyString, BITMAP(rotate_neg_Y_xpm),
_("Rotate Y <-") );
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_ROTATE3D_Z_POS, wxEmptyString, BITMAP(rotate_pos_Z_xpm),
_("Rotate Z ->") );
m_HToolBar->AddTool(ID_ROTATE3D_Z_NEG, wxEmptyString, BITMAP(rotate_neg_Z_xpm),
_("Rotate Z <-") );
m_HToolBar->AddSeparator();
m_HToolBar->AddTool(ID_MOVE3D_LEFT, wxEmptyString, BITMAP(left_xpm),
_("Move left <-") );
m_HToolBar->AddTool(ID_MOVE3D_RIGHT, wxEmptyString, BITMAP(right_xpm),
_("Move right ->") );
m_HToolBar->AddTool(ID_MOVE3D_UP, wxEmptyString, BITMAP(up_xpm),
_("Move Up ^") );
m_HToolBar->AddTool(ID_MOVE3D_DOWN, wxEmptyString, BITMAP(down_xpm),
_("Move Down") );
m_HToolBar->Realize();
// SetToolbars();
}
/*********************************************/
void WinEDA3D_DrawFrame::ReCreateVToolbar(void)
/*********************************************/
{
}
/**********************************************/
void WinEDA3D_DrawFrame::ReCreateMenuBar(void)
/**********************************************/
{
wxMenuBar *menuBar = new wxMenuBar;
wxMenu *fileMenu = new wxMenu;
menuBar->Append(fileMenu, _("&File") );
fileMenu->Append(ID_MENU_SCREENCOPY_PNG, _("Create Image (png format)"));
fileMenu->Append(ID_MENU_SCREENCOPY_JPEG, _("Create Image (jpeg format)"));
fileMenu->AppendSeparator();
fileMenu->Append(wxID_EXIT, _("&Exit"));
wxMenu *referencesMenu = new wxMenu;
menuBar->Append(referencesMenu, _("&Preferences") );
ADD_MENUITEM(referencesMenu, ID_MENU3D_BGCOLOR_SELECTION,
_("Choose background color"), palette_xpm)
SetMenuBar(menuBar);
}
/*****************************************/
void WinEDA3D_DrawFrame::SetToolbars(void)
/*****************************************/
{
}
/////////////////////////////////////////////////////////////////////////////
// Name: 3d_viewer.h
/////////////////////////////////////////////////////////////////////////////
#if !wxUSE_GLCANVAS
#error Please set wxUSE_GLCANVAS to 1 in setup.h.
#endif
#include "wx/glcanvas.h"
#ifdef __WXMAC__
# ifdef __DARWIN__
# include <OpenGL/gl.h>
# include <OpenGL/glu.h>
# else
# include <gl.h>
# include <glu.h>
# endif
#else
# include <GL/gl.h>
# include <GL/glu.h>
#endif
#ifdef VIEWER_MAIN
#define global_3d
#else
#define global_3d extern
#endif
#include "pcbstruct.h"
#include "3d_struct.h"
#define LIB3D_PATH wxT("packages3d/")
class Pcb3D_GLCanvas;
class WinEDA3D_DrawFrame;
class Info_3D_Visu;
class S3D_Vertex;
class SEGVIA;
#define m_ROTX m_Rot[0]
#define m_ROTY m_Rot[1]
#define m_ROTZ m_Rot[2]
/* information needed to display 3D board */
class Info_3D_Visu
{
public:
float m_Beginx, m_Beginy; /* position of mouse */
float m_Quat[4]; /* orientation of object */
float m_Rot[4]; /* man rotation of object */
float m_Zoom; /* field of view in degrees */
S3D_Color m_BgColor;
wxPoint m_BoardPos;
wxSize m_BoardSize;
int m_Layers;
EDA_BoardDesignSettings * m_BoardSettings; // Link to current board design settings
float m_Epoxy_Width; /* Epoxy tickness (normalized) */
float m_BoardScale; /* Normalisation scale for coordinates:
when scaled tey are between -1.0 and +1.0 */
float m_LayerZcoord[32];
public:
Info_3D_Visu(void);
~Info_3D_Visu(void);
};
class Pcb3D_GLCanvas: public wxGLCanvas
{
public:
WinEDA3D_DrawFrame * m_Parent;
private:
bool m_init;
GLuint m_gllist;
public:
Pcb3D_GLCanvas(WinEDA3D_DrawFrame *parent, const wxWindowID id = -1,
int* gl_attrib = NULL);
~Pcb3D_GLCanvas(void);
void ClearLists(void);
void OnPaint(wxPaintEvent& event);
void OnSize(wxSizeEvent& event);
void OnEraseBackground(wxEraseEvent& event);
void OnChar(wxKeyEvent& event);
void OnMouseEvent(wxMouseEvent& event);
void OnRightClick(wxMouseEvent& event);
void OnPopUpMenu(wxCommandEvent & event);
void TakeScreenshot(wxCommandEvent & event);
void SetView3D(int keycode);
void DisplayStatus(void);
void Redraw(void);
GLuint DisplayCubeforTest(void);
void OnEnterWindow( wxMouseEvent& event );
void Render( void );
GLuint CreateDrawGL_List(void);
void InitGL(void);
void SetLights(void);
void Draw3D_Track(TRACK * track);
void Draw3D_Via(SEGVIA * via);
void Draw3D_DrawSegment(DRAWSEGMENT * segment);
DECLARE_EVENT_TABLE()
};
class WinEDA3D_DrawFrame: public wxFrame
{
public:
WinEDA_BasePcbFrame * m_Parent;
WinEDA_App * m_ParentAppl;
Pcb3D_GLCanvas * m_Canvas;
wxToolBar * m_HToolBar;
wxToolBar * m_VToolBar;
int m_InternalUnits;
wxPoint m_FramePos;
wxSize m_FrameSize;
private:
wxString m_FrameName; // name used for writting and reading setup
// It is "Frame3D"
public:
WinEDA3D_DrawFrame(WinEDA_BasePcbFrame * parent, WinEDA_App *app_parent,
const wxString& title );
void Exit3DFrame(wxCommandEvent& event);
void OnCloseWindow(wxCloseEvent & Event);
void ReCreateMenuBar(void);
void ReCreateHToolbar(void);
void ReCreateVToolbar(void);
void SetToolbars(void);
void GetSettings(void);
void SaveSettings(void);
void OnLeftClick(wxDC * DC, const wxPoint& MousePos);
void OnRightClick(const wxPoint& MousePos, wxMenu * PopMenu);
void OnKeyEvent(wxKeyEvent& event);
int BestZoom(void); // Retourne le meilleur zoom
void RedrawActiveWindow(wxDC * DC, bool EraseBg);
void Process_Special_Functions(wxCommandEvent& event);
void Process_Zoom(wxCommandEvent& event);
void NewDisplay(void);
void Set3DBgColor(void);
DECLARE_EVENT_TABLE()
};
void SetGLColor(int color);
void Set_Object_Data(const S3D_Vertex * coord, int nbcoord );
global_3d Info_3D_Visu g_Parm_3D_Visu;
global_3d double g_Draw3d_dx, g_Draw3d_dy;
global_3d double ZBottom, ZTop;
global_3d double DataScale3D; // coeff de conversion unites utilsateut -> unites 3D
global_3d int gl_attrib[]
#ifdef VIEWER_MAIN
= { WX_GL_RGBA, WX_GL_MIN_RED, 8, WX_GL_MIN_GREEN, 8,
WX_GL_MIN_BLUE, 8, WX_GL_DEPTH_SIZE, 16,
WX_GL_DOUBLEBUFFER,
GL_NONE }
#endif
;
#include "bitmaps3d/import3d.xpm"
#include "bitmaps3d/rotate+x.xpm"
#include "bitmaps3d/rotate-x.xpm"
#include "bitmaps3d/rotate+y.xpm"
#include "bitmaps3d/rotate-y.xpm"
#include "bitmaps3d/rotate+z.xpm"
#include "bitmaps3d/rotate-z.xpm"
#include "bitmaps3d/axis3d.xpm"
#include "bitmaps3d/axis3d_bottom.xpm"
#include "bitmaps3d/axis3d_top.xpm"
#include "bitmaps3d/axis3d_left.xpm"
#include "bitmaps3d/axis3d_right.xpm"
#include "bitmaps3d/axis3d_front.xpm"
#include "bitmaps3d/axis3d_back.xpm"
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char * axis3d_xpm[];
#else
char * axis3d_xpm[] = {
"16 15 3 1",
" c None",
". c Blue",
"x c Red",
" . ",
" ... ",
" . ",
" . ",
" . ",
" . ",
" . . ",
" ............",
" . . ",
" . ",
" . ",
" . ",
" .. ",
" . ",
" "
};
#endif
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char * axis3d_back_xpm[];
#else
char * axis3d_back_xpm[] = {
"16 15 3 1",
" c None",
". c Blue",
"x c Red",
" . x ",
" ... x ",
" . x ",
" . xxxxx ",
" . xxx ",
" . x ",
" . . ",
" ............",
" . . ",
" . ",
" . ",
" . ",
" .. ",
" . ",
" "
};
#endif
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char * axis3d_bottom_xpm[];
#else
char * axis3d_bottom_xpm[] = {
"16 15 3 1",
" c None",
". c Blue",
"x c Red",
" . ",
" ... ",
" . ",
" . ",
" . ",
" . ",
" . . ",
" ............",
" . . ",
" . x ",
" . xxx ",
" . xxxxx ",
" .. x ",
" . x ",
" x "
};
#endif
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char * axis3d_front_xpm[];
#else
char * axis3d_front_xpm[] = {
"16 15 3 1",
" c None",
". c Blue",
"x c Red",
" . ",
" ... ",
" . ",
" . ",
" . ",
" . ",
" . . ",
" ............",
" . x . ",
" . xxx ",
" . xxxxx ",
" . x ",
" .. x ",
" . x ",
" "
};
#endif
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char * axis3d_left_xpm[];
#else
char * axis3d_left_xpm[] = {
"16 15 3 1",
" c None",
". c Blue",
"x c Red",
" . ",
" ... ",
" . ",
" . ",
" x. ",
" xx ",
"xxxxxx . ",
" xx...........",
" x . ",
" . ",
" . ",
" . ",
" .. ",
" . ",
" "
};
#endif
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char * axis3d_right_xpm[];
#else
char * axis3d_right_xpm[] = {
"16 15 3 1",
" c None",
". c Blue",
"x c Red",
" . ",
" ... ",
" . ",
" . ",
" . x ",
" . xx ",
" . xxxxxx",
" .......xx...",
" . x . ",
" . ",
" . ",
" . ",
" .. ",
" . ",
" "
};
#endif
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char * axis3d_top_xpm[];
#else
char * axis3d_top_xpm[] = {
"16 15 3 1",
" c None",
". c Blue",
"x c Red",
" . x ",
" ... x ",
" . x ",
" . xxxxx ",
" . xxx ",
" . x ",
" . . ",
" ............",
" . . ",
" . ",
" . ",
" . ",
" .. ",
" . ",
" "
};
#endif
/* XPM bitmap */
#ifndef XPM_3D_MAIN
extern char *import3d_xpm[];
#else
char *import3d_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 3 1",
"- c Black",
"X c None",
"o c Green",
/* pixels */
"XXXXXXXXXXXXXXXX",
"----------------",
"-oooooooooooooo-",
"X-oooooooooooo-X",
"X-oooooooooooo-X",
"XX-oooooooooo-XX",
"XX-oooooooooo-XX",
"----oooooooo----",
"X-oooooooooooo-X",
"XX-oooooooooo-XX",
"XXX-oooooooo-XXX",
"XXXX-oooooo-XXXX",
"XXXXX-oooo-XXXXX",
"XXXXXX-oo-XXXXXX",
"XXXXXXX--XXXXXXX"
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXX"
};
#endif
/* XPM */
#ifndef XPM_3D_MAIN
extern char *rotate_pos_X_xpm[];
#else
char *rotate_pos_X_xpm[] = {
/* width height num_colors chars_per_pixel */
" 16 15 4 1",
/* colors */
". c #000080",
"# c #c0c0c0",
"a c #808080",
"o c #008000",
/* pixels */
"##oo###oo#######",
"###oo#oo########",
"####ooo#########",
"###oo#oo########",
"##oo###oo...a###",
"##.###...###.a##",
"##..#.#######.##",
"##...########.##",
"##....#######.##",
"##.....#####.a##",
"###########a.###",
"################",
"################",
"################",
"################"
};
#endif
/* XPM */
#ifndef XPM_3D_MAIN
extern char *rotate_pos_Y_xpm[];
#else
char *rotate_pos_Y_xpm[] = {
/* width height num_colors chars_per_pixel */
" 16 15 4 1",
/* colors */
". c #000080",
"# c #c0c0c0",
"a c #808080",
"o c #FF0000",
/* pixels */
"##oo###oo#######",
"###oo#oo########",
"####ooo#########",
"####oo##########",
"o##oo...########",
"#oo.####..###.##",
"##.#######.#..##",
"##.########...##",
"##.#######....##",
"##a.#####.....##",
"###.a###########",
"################",
"################",
"################",
"################"
};
#endif
/* XPM */
#ifndef XPM_3D_MAIN
extern char *rotate_pos_Z_xpm[];
#else
char *rotate_pos_Z_xpm[] = {
/* width height num_colors chars_per_pixel */
" 16 15 4 1",
/* colors */
". c #000080",
"# c #c0c0c0",
"a c #808080",
"o c #008000",
/* pixels */
"###oooooo#######",
"######oo########",
"#####oo#########",
"####oo##########",
"###oooooo...a###",
"##.###..####.a##",
"##..#.#######.##",
"##...########.##",
"##....#######.##",
"##.....#####.a##",
"###########a.###",
"################",
"################",
"################",
"################"
};
#endif
/* XPM */
#ifndef XPM_3D_MAIN
extern char *rotate_neg_X_xpm[];
#else
char *rotate_neg_X_xpm[] = {
/* width height num_colors chars_per_pixel */
" 16 15 4 1",
/* colors */
". c #000080",
"# c #c0c0c0",
"a c #808080",
"o c #004000",
/* pixels */
"##oo###oo#######",
"###oo#oo########",
"####ooo#########",
"###oo#oo########",
"##oo...oo#######",
"##a.####..###.##",
"##.#######.#..##",
"##.########...##",
"##.#######....##",
"##a.#####.....##",
"###.a###########",
"################",
"################",
"################",
"################"
};
#endif
/* XPM */
#ifndef XPM_3D_MAIN
extern char *rotate_neg_Y_xpm[];
#else
char *rotate_neg_Y_xpm[] = {
/* width height num_colors chars_per_pixel */
" 16 15 4 1",
/* colors */
". c #000080",
"# c #c0c0c0",
"a c #808080",
"o c #FF0000",
/* pixels */
"##oo###oo#######",
"###oo#oo########",
"####ooo#########",
"####oo##########",
"o##oo###....a###",
"#oo###..####.a##",
"##..#.#######.##",
"##...########.##",
"##....#######.##",
"##.....#####.a##",
"###########a.###",
"################",
"################",
"################",
"################"
};
#endif
/* XPM */
#ifndef XPM_3D_MAIN
extern char *rotate_neg_Z_xpm[];
#else
char *rotate_neg_Z_xpm[] = {
/* width height num_colors chars_per_pixel */
" 16 15 4 1",
/* colors */
". c #000080",
"# c #c0c0c0",
"a c #808080",
"o c #008000",
/* pixels */
"###oooooo#######",
"######oo########",
"#####oo#########",
"####oo##########",
"###oooooo#######",
"##a.####..###.##",
"##.#######.#..##",
"##.########...##",
"##.#######....##",
"##a.#####.....##",
"###.a###########",
"################",
"################",
"################",
"################"
};
#endif
/* XPM bitmap */
#ifndef XPMMAIN
extern char * zoomoins3d_xpm[];
#else
char * zoomoins3d_xpm[] = {
"16 16 3 1",
" c None",
". c Black",
"X c Gray100",
" .... ",
" ..XXXX.. ",
" .XXXXXXXX. ",
" .XXXXXXXX. ",
".XXXXXXXXXX. ",
".XX......XX. ",
".XX......XX. ",
".XXXXXXXXXX. ",
" .XXXXXXXX. ",
" .XXXXXXXX. ",
" ..XXXX... ",
" .... ... ",
" ... ",
" ... ",
" ... ",
" .. "
};
#endif
/* XPM bitmap */
#ifndef XPMMAIN
extern char * zoompage3d_xpm[];
#else
char *zoompage3d_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 5 1",
" c Black",
". c None",
"X c Gray100",
"o c #808080",
"O c Cyan",
/* pixels */
" .......",
" XXXXXXX ......",
" XXXXXXX . .....",
" XXXXXXX ....",
" XXXXXXXXXX ....",
" XXXXXXX ....",
" XXXXXX o..o ...",
" XXXXX oOO.oo ..",
" XXXXX .O..o. ..",
" XXXXX ....o. ..",
" XXXXX o..Ooo ..",
" XXXXXX o..o o..",
" XXXXXXX o .",
" XXXXXXXXXX . ",
" .. "
};
#endif
/* XPM bitmap */
#ifndef XPMMAIN
extern char * zoomplus3d_xpm[];
#else
char * zoomplus3d_xpm[] = {
"16 16 3 1",
" c None",
". c Black",
"X c Gray100",
" .... ",
" ..XXXX.. ",
" .XXXXXXXX. ",
" .XXX..XXX. ",
".XXXX..XXXX. ",
".XX......XX. ",
".XX......XX. ",
".XXXX..XXXX. ",
" .XXX..XXX. ",
" .XXXXXXXX. ",
" ..XXXX... ",
" .... ... ",
" ... ",
" ... ",
" ... ",
" .. "
};
#endif
/* XPM bitmap */
#ifndef XPMMAIN
extern char * zoomrefr3d_xpm[];
#else
char * zoomrefr3d_xpm[] = {
"16 16 3 1",
" c None",
". c #0000A0",
"X c #C0C0A0",
" .... ",
" ..XXXX.. ",
" .XXXXXXXX. ",
" .XXXXXXXX. ",
".XXXXXXXXXX. ",
".XXXXXXXXXX. ",
".XXXXXXXXXX. ",
".XXXXXXXXXX. ",
" .XXXXXXXX. ",
" .XXXXXXXX. ",
" ..XXXX... ",
" .... ... ",
" ... ",
" ... ",
" ... ",
" .. "
};
#endif
WXDIR = $(WXWIN)
TARGET=3d-viewer
DLLSUFF=.dll
include ../libs.win
DLLGEN=dllwrap --export-all --output-def $(TARGET).def --implib lib$(TARGET).a --driver-name c++
all: $(TARGET).a
include makefile.include
$(TARGET).a: $(OBJECTS3D)
ar ruv $@ $(OBJECTS3D)
ranlib $@
clean :
rm -f *.o
rm -f *.bak
rm -f $(TARGET).a
## Makefile for 3d-viewer.a ( wxGTK - LINUX )
CC = gcc
# Compiler flags.
CPPFLAGS = -Wall -O2 -DPCBNEW -I../pcbnew -I ../include -I../common\
`wx-config --cxxflags`
include ../libs.linux
TARGET = 3d-viewer
FINAL = 1
all: $(TARGET).a
include makefile.include
$(TARGET).a: $(OBJECTS3D) makefile.gtk makefile.include
rm -f $@
ar -rv $@ $(OBJECTS3D)
ranlib $@
clean:
rm -f *.o
rm -f *.exe
rm -f *.res
rm -f *.map
rm -f $(TARGET).a
EXTRALIBS =
EXTRACPPFLAGS= -I./ -I../include -I../common -I../pcbnew
OBJECTS3D = 3d_frame.o 3d_read_mesh.o 3d_canvas.o trackball.o 3d_aux.o\
3d_draw.o 3d_toolbar.o 3d_class.o
OBJECTS= ../common/trigo.o
AUXLIBS= -mthreads -o $(TARGET)$(DLLSUFF)\
$(WXLIB_BASE) $(LIBS3D)\
-lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm\
-lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32
3d_class.o: 3d_class.cpp 3d_struct.h 3d_viewer.h
3d_read_mesh.o: 3d_read_mesh.cpp 3d_struct.h 3d_viewer.h
3d_frame.o: 3d_frame.cpp 3d_viewer.h
3d_canvas.o: 3d_canvas.cpp 3d_viewer.h
3d_aux.o: 3d_aux.cpp 3d_viewer.h
3d_draw.o: 3d_draw.cpp 3d_viewer.h 3d_struct.h
3d_toolbar.o: 3d_toolbar.cpp 3d_viewer.h
## Makefile for 3d-viewer.a ( wxMAC - mac os X)
CC = gcc
# Compiler flags.
CPPFLAGS = -Wall -O2 -DPCBNEW -I../pcbnew -I ../include -I../common\
`wx-config --cxxflags`
include ../libs.macosx
TARGET = 3d-viewer
FINAL = 1
all: $(TARGET).a
include makefile.include
$(TARGET).a: $(OBJECTS3D) makefile.gtk makefile.include
rm -f $@
ar -rv $@ $(OBJECTS3D)
ranlib $@
clean:
rm -f *.o
rm -f *.exe
rm -f *.res
rm -f *.map
rm -f $(TARGET).a
/*
* (c) Copyright 1993, 1994, Silicon Graphics, Inc.
* ALL RIGHTS RESERVED
* Permission to use, copy, modify, and distribute this software for
* any purpose and without fee is hereby granted, provided that the above
* copyright notice appear in all copies and that both the copyright notice
* and this permission notice appear in supporting documentation, and that
* the name of Silicon Graphics, Inc. not be used in advertising
* or publicity pertaining to distribution of the software without specific,
* written prior permission.
*
* THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
* AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
* GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
* SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
* KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
* LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
* THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
* POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
*
* US Government Users Restricted Rights
* Use, duplication, or disclosure by the Government is subject to
* restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
* (c)(1)(ii) of the Rights in Technical Data and Computer Software
* clause at DFARS 252.227-7013 and/or in similar or successor
* clauses in the FAR or the DOD or NASA FAR Supplement.
* Unpublished-- rights reserved under the copyright laws of the
* United States. Contractor/manufacturer is Silicon Graphics,
* Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
*
* OpenGL(TM) is a trademark of Silicon Graphics, Inc.
*/
/*
* Trackball code:
*
* Implementation of a virtual trackball.
* Implemented by Gavin Bell, lots of ideas from Thant Tessman and
* the August '88 issue of Siggraph's "Computer Graphics," pp. 121-129.
*
* Vector manip code:
*
* Original code from:
* David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli
*
* Much mucking with by:
* Gavin Bell
*/
#include <math.h>
#include "trackball.h"
/*
* This size should really be based on the distance from the center of
* rotation to the point on the object underneath the mouse. That
* point would then track the mouse as closely as possible. This is a
* simple example, though, so that is left as an Exercise for the
* Programmer.
*/
#define TRACKBALLSIZE (0.8f)
/*
* Local function prototypes (not defined in trackball.h)
*/
static float tb_project_to_sphere(float, float, float);
static void normalize_quat(float [4]);
void
vzero(float *v)
{
v[0] = 0.0;
v[1] = 0.0;
v[2] = 0.0;
}
void
vset(float *v, float x, float y, float z)
{
v[0] = x;
v[1] = y;
v[2] = z;
}
void
vsub(const float *src1, const float *src2, float *dst)
{
dst[0] = src1[0] - src2[0];
dst[1] = src1[1] - src2[1];
dst[2] = src1[2] - src2[2];
}
void
vcopy(const float *v1, float *v2)
{
register int i;
for (i = 0 ; i < 3 ; i++)
v2[i] = v1[i];
}
void
vcross(const float *v1, const float *v2, float *cross)
{
float temp[3];
temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]);
temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]);
temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]);
vcopy(temp, cross);
}
float
vlength(const float *v)
{
return (float) sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
}
void
vscale(float *v, float div)
{
v[0] *= div;
v[1] *= div;
v[2] *= div;
}
void
vnormal(float *v)
{
vscale(v, 1.0f/vlength(v));
}
float
vdot(const float *v1, const float *v2)
{
return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
}
void
vadd(const float *src1, const float *src2, float *dst)
{
dst[0] = src1[0] + src2[0];
dst[1] = src1[1] + src2[1];
dst[2] = src1[2] + src2[2];
}
/*
* Ok, simulate a track-ball. Project the points onto the virtual
* trackball, then figure out the axis of rotation, which is the cross
* product of P1 P2 and O P1 (O is the center of the ball, 0,0,0)
* Note: This is a deformed trackball-- is a trackball in the center,
* but is deformed into a hyperbolic sheet of rotation away from the
* center. This particular function was chosen after trying out
* several variations.
*
* It is assumed that the arguments to this routine are in the range
* (-1.0 ... 1.0)
*/
void
trackball(float q[4], float p1x, float p1y, float p2x, float p2y)
{
float a[3]; /* Axis of rotation */
float phi; /* how much to rotate about axis */
float p1[3], p2[3], d[3];
float t;
if (p1x == p2x && p1y == p2y) {
/* Zero rotation */
vzero(q);
q[3] = 1.0;
return;
}
/*
* First, figure out z-coordinates for projection of P1 and P2 to
* deformed sphere
*/
vset(p1, p1x, p1y, tb_project_to_sphere(TRACKBALLSIZE, p1x, p1y));
vset(p2, p2x, p2y, tb_project_to_sphere(TRACKBALLSIZE, p2x, p2y));
/*
* Now, we want the cross product of P1 and P2
*/
vcross(p2,p1,a);
/*
* Figure out how much to rotate around that axis.
*/
vsub(p1, p2, d);
t = vlength(d) / (2.0f*TRACKBALLSIZE);
/*
* Avoid problems with out-of-control values...
*/
if (t > 1.0) t = 1.0;
if (t < -1.0) t = -1.0;
phi = 2.0f * (float) asin(t);
axis_to_quat(a,phi,q);
}
/*
* Given an axis and angle, compute quaternion.
*/
void
axis_to_quat(float a[3], float phi, float q[4])
{
vnormal(a);
vcopy(a, q);
vscale(q, (float) sin(phi/2.0));
q[3] = (float) cos(phi/2.0);
}
/*
* Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet
* if we are away from the center of the sphere.
*/
static float
tb_project_to_sphere(float r, float x, float y)
{
float d, t, z;
d = (float) sqrt(x*x + y*y);
if (d < r * 0.70710678118654752440) { /* Inside sphere */
z = (float) sqrt(r*r - d*d);
} else { /* On hyperbola */
t = r / 1.41421356237309504880f;
z = t*t / d;
}
return z;
}
/*
* Given two rotations, e1 and e2, expressed as quaternion rotations,
* figure out the equivalent single rotation and stuff it into dest.
*
* This routine also normalizes the result every RENORMCOUNT times it is
* called, to keep error from creeping in.
*
* NOTE: This routine is written so that q1 or q2 may be the same
* as dest (or each other).
*/
#define RENORMCOUNT 97
void
add_quats(float q1[4], float q2[4], float dest[4])
{
static int count=0;
float t1[4], t2[4], t3[4];
float tf[4];
vcopy(q1,t1);
vscale(t1,q2[3]);
vcopy(q2,t2);
vscale(t2,q1[3]);
vcross(q2,q1,t3);
vadd(t1,t2,tf);
vadd(t3,tf,tf);
tf[3] = q1[3] * q2[3] - vdot(q1,q2);
dest[0] = tf[0];
dest[1] = tf[1];
dest[2] = tf[2];
dest[3] = tf[3];
if (++count > RENORMCOUNT) {
count = 0;
normalize_quat(dest);
}
}
/*
* Quaternions always obey: a^2 + b^2 + c^2 + d^2 = 1.0
* If they don't add up to 1.0, dividing by their magnitued will
* renormalize them.
*
* Note: See the following for more information on quaternions:
*
* - Shoemake, K., Animating rotation with quaternion curves, Computer
* Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985.
* - Pletinckx, D., Quaternion calculus as a basic tool in computer
* graphics, The Visual Computer 5, 2-13, 1989.
*/
static void
normalize_quat(float q[4])
{
int i;
float mag;
mag = (q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
for (i = 0; i < 4; i++) q[i] /= mag;
}
/*
* Build a rotation matrix, given a quaternion rotation.
*
*/
void
build_rotmatrix(float m[4][4], float q[4])
{
m[0][0] = 1.0f - 2.0f * (q[1] * q[1] + q[2] * q[2]);
m[0][1] = 2.0f * (q[0] * q[1] - q[2] * q[3]);
m[0][2] = 2.0f * (q[2] * q[0] + q[1] * q[3]);
m[0][3] = 0.0f;
m[1][0] = 2.0f * (q[0] * q[1] + q[2] * q[3]);
m[1][1]= 1.0f - 2.0f * (q[2] * q[2] + q[0] * q[0]);
m[1][2] = 2.0f * (q[1] * q[2] - q[0] * q[3]);
m[1][3] = 0.0f;
m[2][0] = 2.0f * (q[2] * q[0] - q[1] * q[3]);
m[2][1] = 2.0f * (q[1] * q[2] + q[0] * q[3]);
m[2][2] = 1.0f - 2.0f * (q[1] * q[1] + q[0] * q[0]);
m[2][3] = 0.0f;
m[3][0] = 0.0f;
m[3][1] = 0.0f;
m[3][2] = 0.0f;
m[3][3] = 1.0f;
}
/*
* (c) Copyright 1993, 1994, Silicon Graphics, Inc.
* ALL RIGHTS RESERVED
* Permission to use, copy, modify, and distribute this software for
* any purpose and without fee is hereby granted, provided that the above
* copyright notice appear in all copies and that both the copyright notice
* and this permission notice appear in supporting documentation, and that
* the name of Silicon Graphics, Inc. not be used in advertising
* or publicity pertaining to distribution of the software without specific,
* written prior permission.
*
* THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
* AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
* GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
* SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
* KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
* LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
* THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
* POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
*
* US Government Users Restricted Rights
* Use, duplication, or disclosure by the Government is subject to
* restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
* (c)(1)(ii) of the Rights in Technical Data and Computer Software
* clause at DFARS 252.227-7013 and/or in similar or successor
* clauses in the FAR or the DOD or NASA FAR Supplement.
* Unpublished-- rights reserved under the copyright laws of the
* United States. Contractor/manufacturer is Silicon Graphics,
* Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
*
* OpenGL(TM) is a trademark of Silicon Graphics, Inc.
*/
/*
* trackball.h
* A virtual trackball implementation
* Written by Gavin Bell for Silicon Graphics, November 1988.
*/
/*
* Pass the x and y coordinates of the last and current positions of
* the mouse, scaled so they are from (-1.0 ... 1.0).
*
* The resulting rotation is returned as a quaternion rotation in the
* first paramater.
*/
void
trackball(float q[4], float p1x, float p1y, float p2x, float p2y);
/*
* Given two quaternions, add them together to get a third quaternion.
* Adding quaternions to get a compound rotation is analagous to adding
* translations to get a compound translation. When incrementally
* adding rotations, the first argument here should be the new
* rotation, the second and third the total rotation (which will be
* over-written with the resulting new total rotation).
*/
void
add_quats(float *q1, float *q2, float *dest);
/*
* A useful function, builds a rotation matrix in Matrix based on
* given quaternion.
*/
void
build_rotmatrix(float m[4][4], float q[4]);
/*
* This function computes a quaternion based on an axis (defined by
* the given vector) and an angle about which to rotate. The angle is
* expressed in radians. The result is put into the third argument.
*/
void
axis_to_quat(float a[3], float phi, float q[4]);
/* XPM */
#ifndef XPMMAIN
extern char *show_3d_xpm[];
#else
char *show_3d_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 3 1",
"J c #FF0000",
"x c #0000FF",
". c none",
"................",
"..JJJJ...JJ.....",
".JJJJJJ..JJJJ...",
".JJ..JJ..JJ.JJ..",
".....JJ..JJ..JJ.",
"..JJJJ...JJ...JJ",
"..JJJJJ..JJ...JJ",
".....JJ..JJ...JJ",
".JJ..JJ..JJ..JJJ",
".JJJJJJ..JJJJJJ.",
"..JJJJ....JJJJ.x",
"..........xxxxxx",
".....xxxxxx.....",
"xxxxxx..........",
"x..............."
};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_arc_xpm[];
#else
char * add_arc_xpm[] = {
"16 16 48 1",
" c None",
". c #222224",
"+ c #07071F",
"@ c #000087",
"# c #00009C",
"$ c #00009B",
"% c #474747",
"& c #FEE2CA",
"* c #C59A74",
"= c #000047",
"- c #00009A",
"; c #000095",
"> c #473C33",
", c #FEBB7F",
"' c #C57B3A",
") c #000015",
"! c #000017",
"~ c #00003A",
"{ c #000075",
"] c #000097",
"^ c #000096",
"/ c #211306",
"( c #060300",
"_ c #000000",
": c #000083",
"< c #000094",
"[ c #00008D",
"} c #000090",
"| c #000055",
"1 c #000081",
"2 c #222222",
"3 c #080807",
"4 c #000091",
"5 c #00008B",
"6 c #070300",
"7 c #14141F",
"8 c #12112D",
"9 c #000059",
"0 c #161616",
"a c #F2D7C1",
"b c #F2BD8E",
"c c #120C10",
"d c #161210",
"e c #F2B279",
"f c #F29747",
"g c #130901",
"h c #140B04",
"i c #140900",
" ",
" .+@#$#$ ",
" %&*=$$$$-; ",
" >,')! ~{]$^ ",
" /(_ :$< ",
" [$} ",
" ]$| ",
" -$1 ",
" 23 $4 ",
" %&*_ $; ",
" >,'_ $5 ",
" /6 789 ",
" 0abc ",
" defg ",
" hi_ ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_circle_xpm[];
#else
char * add_circle_xpm[] = {
"16 16 36 1",
" c None",
". c #00009B",
"+ c #000096",
"@ c #00008C",
"# c #000053",
"$ c #00008A",
"% c #00009A",
"& c #000073",
"* c #00007A",
"= c #000092",
"- c #00006F",
"; c #161616",
"> c #161513",
", c #12122F",
"' c #121125",
") c #F2D7C1",
"! c #F2BD8E",
"~ c #140D08",
"{ c #151519",
"] c #130D07",
"^ c #161210",
"/ c #F2B279",
"( c #F29747",
"_ c #140A01",
": c #151213",
"< c #130901",
"[ c #140B04",
"} c #140900",
"| c #000000",
"1 c #120A18",
"2 c #12080C",
"3 c #00003F",
"4 c #000094",
"5 c #000044",
"6 c #000083",
"7 c #00006A",
" .... ",
" .......+ ",
" ..@# #$.% ",
" ..& *.= ",
" .@ =.- ",
"..# ;> ,' ",
".. ;)!~ {)!] ",
".. ^/(_ :/(< ",
"..# [}| 12| ",
" .$ .@3| ",
" +.* ..4 ",
" %.= ..%5 ",
" =......45 ",
" -64467 ",
" ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_component_xpm[];
#else
char * add_component_xpm[] = {
"16 16 67 1",
" c None",
"! c black",
"# c #D72E2E",
"$ c #D72F2F",
"% c #D62E2E",
"& c #D83434",
"' c #FEFEFF",
"( c #FBFBFF",
") c #F6F6FF",
"* c #F1F1FF",
"+ c #EBE9FC",
", c #E3C3D7",
"- c #DA6C77",
". c #D13838",
"0 c #FF0000",
"1 c #FAFAFF",
"2 c #F5F5FF",
"3 c #F0F0FF",
"4 c #EBEBFF",
"5 c #E6E6FF",
"6 c #E1E1FF",
"7 c #DBDBFF",
"8 c #D6555F",
"9 c #BD5C5C",
": c #9B9B9B",
"; c #F4F4FF",
"< c #EFEFFF",
"= c #EAEAFF",
"> c #E5E5FF",
"? c #E0E0FF",
"@ c #D6D6FF",
"A c #D390AC",
"B c #CB4444",
"C c #E4E4FF",
"D c #DFDFFF",
"E c #DADAFF",
"F c #D5D5FF",
"G c #D0D0FF",
"H c #CCB8E6",
"I c #D73334",
"J c #E9E9FF",
"K c #D4D4FF",
"L c #CFCFFF",
"M c #CACAFF",
"N c #CB8BAF",
"O c #CB4141",
"P c #E3E3FF",
"Q c #DEDEFF",
"R c #D9D9FF",
"S c #C9C9FF",
"T c #C4C4FF",
"U c #D05364",
"V c #B96262",
"W c #9C9C9C",
"X c #DDDDFF",
"Y c #D8D8FF",
"Z c #D3D3FF",
"[ c #CECEFF",
"] c #C9C7FC",
"^ c #C7A8D8",
"_ c #CE647C",
"` c #CD3E3E",
"a c #9E9595",
"b c #D62F2F",
"c c #CC4141",
"d c #BC5C5C",
"e c #9D9595",
" ",
" ",
" ",
" ######$% ",
" &'()*+,-. ",
"0##&123456789 ",
" :&;<=>?7@AB ",
" &<=CDEFGH###0",
" IJCDEKLMNO:::",
" IPQRKLSTUVW ",
"0##IXYZ[]^_`a ",
" :#####bcde: ",
" :::::::: ",
" ",
" ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_dashed_line_xpm[];
#else
char * add_dashed_line_xpm[] = {
"16 16 15 1",
" c None",
". c #03039B",
"+ c #8E8E9B",
"@ c #00009B",
"# c #1F1F9B",
"$ c #93939B",
"% c #00009A",
"& c #46469A",
"* c #9B9B9B",
"= c #93939A",
"- c #16169A",
"; c #0B0B9B",
"> c #97979B",
", c #1E1E9B",
"' c #91919B",
" ",
" .+ ",
" @#$ ",
" @#$ ",
" @#$ ",
" ",
" %&* ",
" %#= ",
" %#= ",
" -= ",
" ;* ",
" @#> ",
" @#$ ",
" @,$ ",
" ' ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_entry_xpm[];
#else
char * add_entry_xpm[] = {
"16 16 10 1",
" c None",
". c #006800",
"+ c #006900",
"@ c #6C8B6C",
"# c #9B9B9B",
"$ c #6C8C6C",
"% c #9A9A9A",
"& c #6B8B6B",
"* c #9C9C9C",
"= c #6A8B6A",
" ",
" ",
" . ",
" +@ ",
" +@# ",
" +$% ",
" +$% ",
" +&# ",
" .&* ",
" .&* ",
" .&# ",
" +=# ",
" =# ",
" % ",
" ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_glabel_xpm[];
#else
char * add_glabel_xpm[] = {
"16 16 54 1",
" c None",
". c #695F00",
"+ c #837E52",
"@ c #6D640F",
"# c #6F6714",
"$ c #706818",
"% c #9C9C9C",
"& c #9191FF",
"* c #9B9BFF",
"= c #A5A5FF",
"- c #857F66",
"; c #746D25",
"> c #827D4F",
", c #7E7841",
"' c #8F8C76",
") c #9E9EFF",
"! c #A8A8FF",
"~ c #B2B2FF",
"{ c #BBBBF9",
"] c #7D7539",
"^ c #7A7437",
"/ c #95948B",
"( c #878460",
"_ c #7D773E",
": c #ACACFF",
"< c #B6B6FF",
"[ c #C0C0FF",
"} c #CACAFF",
"| c #BFBDCC",
"1 c #8C896D",
"2 c #6C6209",
"3 c #989894",
"4 c #B9B9FF",
"5 c #C3C3FF",
"6 c #CECEFF",
"7 c #D5D5F9",
"8 c #847C39",
"9 c #7B7437",
"0 c #9B9B9B",
"a c #797233",
"b c #817C4D",
"c c #756D25",
"d c #898664",
"e c #C7C7FF",
"f c #D1D1FF",
"g c #DBDBFF",
"h c #9B9566",
"i c #999997",
"j c #96958D",
"k c #86825B",
"l c #766F2B",
"m c #706716",
"n c #97968F",
"o c #9A9A9A",
" ",
" ",
" ",
" .. ",
" ...+ ..... ",
" .@#$% .&*=-; ",
" .>,.' .)!~{]^ ",
" ../(._ .:<[}|.1",
" .....23.4567890",
"..abbc.d.efgh;i0",
"..j00k.l....mn0 ",
" o0 0o00000 ",
" ",
" ",
" ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_junction_xpm[];
#else
char * add_junction_xpm[] = {
"16 16 60 1",
" c None",
". c #007D00",
"+ c #4D8B4D",
"@ c #9B9B9B",
"# c #000000",
"$ c #000700",
"% c #0A130A",
"& c #282828",
"* c #222222",
"= c #868483",
"- c #E1D5CA",
"; c #B7A595",
"> c #564A3F",
", c #080707",
"' c #151515",
") c #EAE2DB",
"! c #FFEBDA",
"~ c #FFE0C5",
"{ c #FFD5B1",
"] c #FFCA9C",
"^ c #806044",
"/ c #004C00",
"( c #645F59",
"_ c #FFE6CF",
": c #FFDBBB",
"< c #FFD0A6",
"[ c #FFC591",
"} c #FFBA7D",
"| c #E49C5D",
"1 c #000D00",
"2 c #2F552F",
"3 c #64584D",
"4 c #FFD5B0",
"5 c #FFCA9B",
"6 c #FFBF87",
"7 c #FFB472",
"8 c #FFA95D",
"9 c #E48D41",
"0 c #080F08",
"a c #757575",
"b c #16120F",
"c c #EAB485",
"d c #FFB97C",
"e c #FFAF67",
"f c #FFA453",
"g c #FF993E",
"h c #804715",
"i c #3A3A3A",
"j c #414141",
"k c #22180F",
"l c #865931",
"m c #E18B40",
"n c #B76925",
"o c #562E0A",
"p c #131110",
"q c #8E8E8E",
"r c #686868",
"s c #242424",
"t c #3F3F3F",
"u c #909090",
" .. ",
" .+@ ",
" .+@ ",
" #$%& ",
" *=-;>, ",
" ')!~{]^* ",
".../(_:<[}|1... ",
".++234567890+++@",
" @@abcdefghi@@@@",
" jklmnopq ",
" rs$%tu ",
" @.+@ ",
" .+@ ",
" .+@ ",
" .+@ ",
" @@ "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_line_xpm[];
#else
char * add_line_xpm[] = {
"16 16 3 1",
" c None",
". c #006900",
"+ c #9B9B9B",
" ",
" ",
"...... ",
" ++++.+ ",
" .+ ",
" .+ ",
" .+ ",
" .+ ",
" .+ ",
" .+ ",
" .+ ",
" .......... ",
" ++++++++++",
" ",
" ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_line_label_xpm[];
#else
char * add_line_label_xpm[] = {
"16 16 24 1",
" c None",
". c #000000",
"+ c #020202",
"@ c #8D8D8D",
"# c #202020",
"$ c #555555",
"% c #9A9A9A",
"& c #8C8C8C",
"* c #080808",
"= c #161616",
"- c #9B9B9B",
"; c #131313",
"> c #969696",
", c #212121",
"' c #7C7C7C",
") c #414141",
"! c #515151",
"~ c #525252",
"{ c #070707",
"] c #0B0B0B",
"^ c #979797",
"/ c #1F1F1F",
"( c #6B6B6B",
"_ c #009B00",
" ",
" ..+ ",
" ..+@ ",
" .#.$% ",
" ..&*=- ",
" .;>,.' ",
" ......)- ",
" ..!~~{]^ ",
" ./-% #+( ",
" -- -- ",
" ",
"________________",
"________________",
"----------------",
" ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_polygon_xpm[];
#else
char * add_polygon_xpm[] = {
"16 16 54 1",
" c None",
". c #161616",
"+ c #161513",
"@ c #080808",
"# c #222222",
"$ c #F2D7C0",
"% c #F2BC8E",
"& c #120C24",
"* c #00009B",
"= c #000047",
"- c #C5C4C4",
"; c #FEE2CA",
"> c #46372A",
", c #16120F",
"' c #F2B279",
") c #F29647",
"! c #12091F",
"~ c #C5A68C",
"{ c #FEBB7F",
"] c #462B17",
"^ c #000033",
"/ c #140C04",
"( c #130900",
"_ c #000000",
": c #070402",
"< c #1F1211",
"[ c #00005E",
"} c #000091",
"| c #00008C",
"1 c #00009A",
"2 c #00005F",
"3 c #000040",
"4 c #858484",
"5 c #857D75",
"6 c #26262B",
"7 c #FFE3CB",
"8 c #FFC796",
"9 c #25190E",
"0 c #856243",
"a c #855327",
"b c #00006E",
"c c #12122F",
"d c #12112D",
"e c #F2D7C1",
"f c #F2BD8E",
"g c #130D07",
"h c #161210",
"i c #F29747",
"j c #12091E",
"k c #120F2A",
"l c #130901",
"m c #140B04",
"n c #130800",
"o c #130A04",
" .+ @# ",
".$%&**=-;> ",
",')!**=~{]^ ",
" /(__ :<[} ",
" |12 ",
" 345_ ",
" 6789 ",
" _0a_ ",
" bb_ ",
" ** ",
" ** ",
" .+ cd_ ",
" .ef&*****cefg ",
" h'ij*****k'il ",
" mn__ _on_ ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_rectangle_xpm[];
#else
char * add_rectangle_xpm[] = {
"16 16 24 1",
" c None",
". c #161616",
"+ c #161513",
"@ c #F2D7C0",
"# c #F2BC8E",
"$ c #120C24",
"% c #00009B",
"& c #16120F",
"* c #F2B279",
"= c #F29647",
"- c #12091F",
"; c #120A21",
"> c #12081D",
", c #000000",
"' c #12122F",
") c #12112D",
"! c #F2D7C1",
"~ c #F2BD8E",
"{ c #130D07",
"] c #120F2A",
"^ c #F29747",
"/ c #130901",
"( c #130A04",
"_ c #130800",
" .+ ",
".@#$%%%%%%%%%% ",
"&*=-%%%%%%%%%% ",
" ;>,, %% ",
" %%, %% ",
" %% %% ",
" %% %% ",
" %% %% ",
" %% %% ",
" %% %% ",
" %% %% ",
" %% '), ",
" %%%%%%%%%%'!~{ ",
" %%%%%%%%%%]*^/ ",
" ,(_, ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *add_text_xpm[];
#else
char * add_text_xpm[] = {
"16 16 4 1",
" c None",
". c #00009B",
"+ c #000098",
"@ c #00005D",
" .............. ",
" .............. ",
" .+ .... +. ",
" .@ .... . ",
" .... ",
" .... ",
" .... ",
" .... ",
" .... ",
" .... ",
" .... ",
" .... ",
" .... ",
" .....+ ",
" ........ ",
" "};
#endif
/* XPM */
#ifndef XPMMAIN
extern char *apply_xpm[];
#else
char * apply_xpm[] = {
"16 16 16 1",
" c None",
". c #000000",
"+ c #C8D7E5",
"@ c #8EA8C0",
"# c #9DB8D2",
"$ c #7E94AA",
"% c #8299AF",
"& c #D6E1EB",
"* c #C4CED6",
"= c #ACBED0",
"- c #404040",
"; c #ACB9C5",
"> c #727272",
", c #889FB6",
"' c #B1BFCB",
") c #98B2CC",
" ",
" ",
" ",
" .. ",
" .+@. ",
" .+#$. ",
" .. .+#%. ",
" .&&. .+#%. ",
" .*#=. .+#%. ",
" -=#=.&#%. ",
" .;####%. ",
" >,##%. ",
" .')$. ",
" ... ",
" ",
" "};
#endif
This diff is collapsed.
/* XPM */
#ifndef XPMMAIN
extern char *copyblock_xpm[];
#else
char * copyblock_xpm[] = {
"16 16 18 1",
" c None",
". c #000000",
"+ c #B3B3B3",
"@ c #FFFFFF",
"# c #D6D6D6",
"$ c #646464",
"% c #4D4D4D",
"& c #505050",
"* c #696969",
"= c #787878",
"- c #4C4C4C",
"; c #E3E3E3",
"> c #5A5A5A",
", c #535353",
"' c #919191",
") c #A2A2A2",
"! c #5C5C5C",
"~ c #666666",
".......... ",
".+@@@@@@#. ",
".@@@@@@@@. ",
".@$%&@*=@. ",
".@@@@@@@@. ",
".@&-@&......... ",
".@@@@.+@@@@@@#. ",
".;>,'.@@@@@@@@. ",
".@@@@.@$%&@*=@. ",
".#@@@.@@@@@@@@. ",
"......@&-@)*+@. ",
" .@@@@@@@@. ",
" .;>,'@!~@. ",
" .@@@@@@@@. ",
" .#@@@@@@#. ",
" ......... "};
#endif
This diff is collapsed.
/* XPM */
#ifndef XPMMAIN
extern char *datasheet_xpm[];
#else
char * datasheet_xpm[] = {
"16 16 22 1",
" c None",
". c #000000",
"+ c #010101",
"@ c #FEFEFE",
"# c #EBEBEB",
"$ c #696969",
"% c #272727",
"& c #FFFFFF",
"* c #787878",
"= c #D4D4D4",
"- c #212121",
"; c #3A3A3A",
"> c #757575",
", c #595959",
"' c #B0B0B0",
") c #8E8E8E",
"! c #C3C3C3",
"~ c #913131",
"{ c #8D2D2D",
"] c #852525",
"^ c #C69696",
"/ c #C29292",
" ..........+. ",
".@#########$%. ",
".&##.#.#.#.*=-. ",
".&#........;>,. ",
".&#';######.)!. ",
".&#';######.#!. ",
".&#.........#!. ",
".&##.#.#.#.##!. ",
".&###########!. ",
".~{{{{{{{{{{{]. ",
".~&&^{&&^{&&&]. ",
".~&{&{&{&{&{{]. ",
".~&{&{&{&{&&{]. ",
".~&&^{&{&{&{{]. ",
".~&]]]&&/]&]]]. ",
"............... "};
#endif
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment