First off.. I just love my Askimet plugin….to all those developers out there… I thank you. I suppose everyone’s just trying to make a living but darn… Why don’t spammers just go away….
Time to reload the Jo..
For anyone hitting this post with any of the others I guess I should recap…
I’m trying to find/fix a bug related to setPointFixedConstraint into order to finish a pop-up card project I’m working on and at the same time expand my knowledge of Heekcad/solid modeling/C++ at the same time.
[Ok… I just need to digress for a second hear… I read my daughter Droon everynight at bedtime and in each book that keep telling you how Julie,Neal,Eric team up with Galen,Princess Keah and Max the spider troll to battle against the evil Lord Sparr. (which there is a sparr on the cam# irc, who I don’t think is evil).. The author recaps this in every frikin book and this is so… irritating. ) Sorry just had to get that off my chest. I guess I’m having a internal debate with myself on whether I should do a minor recap in my blog posts. I don’t think anyone reading my dribble on a regular basis… )
I guess I’m blogging more a way for me to keep notes and not really for anyone to read. This actually comes in quite handy when I’ve need to figure out how to do something again.. Occasionally some soul has had the same issue I’ve had, and I’ve saved them a few steps…] Ok.. I’m back..
The issue that I’m having with this heeksCad stuff if that is a heck of a lot of stuff going on here.
A while back, I tried to understand what was going on and I just didn’t have the back ground in C++ what was going on. It was sort of like reading the letters without being able to understand the words. Since then I’ve done a lot of self study, took a engineers class and it’s getting better.. Heekscad has a bunch of highlevel stuff going on in there, I wish could say I understand it all, but I don’t… But as I said its been a journey… I guess I wasn’t quite back but now I really am… Coffee cup is still full, time to really focus…. Really..
I started looking a this Hline.h and I think this probably is a good spot to plant my virtual but and watch whats going on with this code….
Here’s the header file.
// HLine.h
// Copyright (c) 2009, Dan Heeks
// This program is released under the BSD license. See the file COPYING for details.#pragma once
#include “EndedObject.h”
class HLine: public EndedObject{
private:
HeeksColor color;public:
~HLine(void);
HLine(const gp_Pnt &a, const gp_Pnt &b, const HeeksColor* col);
HLine(const HLine &line);
const HLine& operator=(const HLine &b);// HeeksObj’s virtual functions
int GetType()const{return LineType;}
long GetMarkingMask()const{return MARKING_FILTER_LINE;}
void glCommands(bool select, bool marked, bool no_color);
void Draw(wxDC& dc);
void GetBox(CBox &box);
const wxChar* GetTypeString(void)const{return _(“Line”);}
HeeksObj *MakeACopy(void)const;
const wxBitmap &GetIcon();
void SetColor(const HeeksColor &col){color = col;}
const HeeksColor* GetColor()const{return &color;}
void GetGripperPositions(std::list *list, bool just_for_endof);
void GetProperties(std::list
*list);
bool FindNearPoint(const double* ray_start, const double* ray_direction, double *point);
bool FindPossTangentPoint(const double* ray_start, const double* ray_direction, double *point);
void GetSegments(void(*callbackfunc)(const double *p), double pixels_per_mm, bool want_start_point = true)const;
int Intersects(const HeeksObj *object, std::list< double > *rl)const;
void CopyFrom(const HeeksObj* object){operator=(*((HLine*)object));}
void WriteXML(TiXmlNode *root);
void GetTools(std::list* t_list, const wxPoint* p);static HeeksObj* ReadFromXMLElement(TiXmlElement* pElem);
bool UsesID(){return true;}
gp_Lin GetLine()const;
bool Intersects(const gp_Pnt &pnt)const;
gp_Vec GetSegmentVector(double fraction);
void Reverse();
};
Ok… maybe I’m weird.. No correction I am… but this section of code brings alot of stuff together for me…
first off these two little lines.
HLine(const gp_Pnt &a, const gp_Pnt &b, const HeeksColor* col);
HLine(const HLine &line);
Hear we have a two constructors taking input from two very different sources.. I recognize that gp_Pnt stuff as openCascade(which handles the solid modeling stuff). Now the &line… don’t know you…. speak up now boy… where are you defined. (in code:blocks mouse select &line and right click and chose “Find declaration of”)
Hmmm
this takes me to sketchsolve/src/solve.h
class line
{
public:
line(){}
point p1;
point p2;
};
Ok… lets look at those two lines again….
HLine(const gp_Pnt &a, const gp_Pnt &b, const HeeksColor* col);
HLine(const HLine &line);
The “const” tells me we are not going to change anything to the input data… we’re creating this Hline from it.
Looking at the class declaration of line is see we inherit EndedObject. Something tells me when I navigate through that I’ll find Heeksobj as the base class.
In my journeys so far I was running into virtual functions and polymorphism and I need a little refresher here.
I ran across this guy who actually knows whats he’s doing but seems to share my warped sense of humour.
http://www.artima.com/cppsource/pure_virtual.html
Ok.. I get this directly from this source above(but I needed to indent it and bust it up a bit, cause unlike my stuff this is terse)
In C++, a function’s interface is specified by declaring the function.
Member functions are declared in the class definition.
- A function’s implementation is specified by defining the function.
Derived classes can redefine a function,specifying an implementation particular to that derived class (and classes derived from it).
When a virtual function is called, the implementation is chosen based not on the static type of the pointer or reference, but on the type of the object being pointed to, which can vary at run time:
print(shape->area()); // Might invoke Circle::area() or Rectangle::area().
A pure virtual function is declared, but not necessarily defined, by a base class.
A class with a pure virtual function is “abstract” (as opposed to “concrete”), in that it’s not possible to create instances of that class.A derived class must define all inherited pure virtual functions of its base classes to be concrete.
Oiii. I just got done reading that article…. My brain is aching.. It was sort of making sense what he was talking about this “vtbl”
I was doing a little more research on this: http://en.wikipedia.org/wiki/Virtual_method_table I like the cat analogy.. Anyway… quite time is over, the house has woken up and I’m being called to make blueberry pancakes..
Just looking at HLine.h I would have thought that there would have been a couple private variable names for a couple of points… Not seeing this. But I suppose if I search the implementation of the two constructor functions that should end in the same spot one should think. This not what I had expected the two points are up one level so to speak.
Now there’s something weird going on here. There appears to be a Hline.cpp and Hiline.cpp they appear to be very similar.. I think that Hiline deals with infinite lines.
So..
…..
src/Hline.h
class HLine: public EndedObject{
….
src/EndedObject.h
class EndedObject: public ConstrainedObject{
public:
HPoint* A, *B;
….
There you go… the points I was looking for I need to explore that a bit in a moment
…..
src/ContraintedObject.h
class ConstrainedObject: public ObjList{
public:
std::list constraints;
……..
interphase/ObjList.h
class ObjList : public HeeksObj
{
protected:
std::list m_objects;
std::list::iterator LoopIt;
std::list::iterator> LoopItStack;
std::vector m_index_list; // for quick performance of GetAtIndex();
bool m_index_list_valid;
void recalculate_index_list();
void copy_objects(const ObjList& objlist);
……………..
And finally
……………..
interphase/HeeksObj.h
class HeeksObj{
std::list m_owners;
std::list::iterator m_owners_it;
public:
bool m_skip_for_undo;
unsigned int m_id;
unsigned int m_layer;
bool m_visible;
bool m_preserving_id;
HeeksObj(void);
HeeksObj(const HeeksObj& ho);
…………………….
that deal with the std::list seems a bit recursive which I suppose makes sense…
…………
Now it looks like class CHeeksCADInterface calls out a bunch of HeeksObj pointer variables….
I’m not sure where that code comes into play.. CHeeksCADInterface is called out…
Then.. there is a bunch of HeeksObj variables declared in…..
……..
class HeeksCADapp : public wxApp, public ObjList
{
……..
That looks like something that would be real close to the main() function which of course you can’t find directly in a wxwidget application.
Aw heck I use to know this..
http://www.wxwidgets.org/docs/tutorials/hello.htm
Ok… that is real close to the top…
The actual top for our purposes begins at:IMPLEMENT_APP(HeeksCADapp)… Yep yep yep…
Still not having that aha moment… But I want to get back to that
src/EndedObject.h
class EndedObject: public ConstrainedObject{
public:
HPoint* A, *B;
I wanted to see what’s in that HPoint whats going on with that:
class HPoint: public ConstrainedObject{
private:
HeeksColor color;public:
gp_Pnt m_p;
bool m_draw_unselected;
double mx,my;~HPoint(void);
HPoint(const gp_Pnt &p, const HeeksColor* col);
HPoint(const HPoint &p);const HPoint& operator=(const HPoint &b);
// HeeksObj’s virtual functions
int GetType()const{return PointType;}
long GetMarkingMask()const{return MARKING_FILTER_POINT;}
void glCommands(bool select, bool marked, bool no_color);
void GetBox(CBox &box);
const wxChar* GetTypeString(void)const{return _(“Point”);}
HeeksObj *MakeACopy(void)const;
const wxBitmap &GetIcon();
void ModifyByMatrix(const double *mat);
void SetColor(const HeeksColor &col){color = col;}
const HeeksColor* GetColor()const{return &color;}
void GetGripperPositions(std::list<GripData> *list, bool just_for_endof);
void GetProperties(std::list<Property *> *list);
bool GetStartPoint(double* pos);
bool GetEndPoint(double* pos);
void CopyFrom(const HeeksObj* object){operator=(*((HPoint*)object));}
void WriteXML(TiXmlNode *root);
void LoadFromDoubles();
void LoadToDoubles();
bool IsDifferent(HeeksObj* other);
void GetTools(std::list<Tool*>* t_list, const wxPoint* p);void Draw(wxDC& dc);
static HeeksObj* ReadFromXMLElement(TiXmlElement* pElem);
……………………
Yikess. Lot O stuff going on in there…
gp_Pnt is defined in gp_Pnt.hxx which is in /usr/include/opencascade/gp_Pnt.hxx
//! Defines a non-persistent 3D cartesian point.
class gp_Pnt {
public:
void* operator new(size_t,void* anAddress)
{
return anAddress;
}
void* operator new(size_t size)
{
return Standard::Allocate(size);
}
void operator delete(void *anAddress)
{
if (anAddress) Standard::Free((Standard_Address&)anAddress);
}// Methods PUBLIC
//
//! Creates an indefinite point.gp_Pnt();
//! Creates a point with a triplet of coordinates.gp_Pnt(const gp_XYZ& Coord);
//! Creates a point with its 3 cartesian’s coordinates : Xp, Yp, Zp.
gp_Pnt(const Standard_Real Xp,const Standard_Real Yp,const Standard_Real Zp);
//! Changes the coordinate of range Index :
//! Index = 1 => X is modified
//! Index = 2 => Y is modified
//! Index = 3 => Z is modified
//! Raised if Index != {1, 2, 3}.void SetCoord(const Standard_Integer Index,const Standard_Real Xi) ;
//! For this point, assigns the values Xp, Yp and Zp to its three coordinates.void SetCoord(const Standard_Real Xp,const Standard_Real Yp,const Standard_Real Zp) ;
//! Assigns the given value to the X coordinate of this point.void SetX(const Standard_Real X) ;
//! Assigns the given value to the Y coordinate of this point.void SetY(const Standard_Real Y) ;
//! Assigns the given value to the Z coordinate of this point.void SetZ(const Standard_Real Z) ;
//! Assigns the three coordinates of Coord to this point.void SetXYZ(const gp_XYZ& Coord) ;
//! Returns the coordinate of corresponding to the value of Index :
//! Index = 1 => X is returned
//! Index = 2 => Y is returned
//! Index = 3 => Z is returned
//! Raises OutOfRange if Index != {1, 2, 3}.
//! Raised if Index != {1, 2, 3}.Standard_Real Coord(const Standard_Integer Index) const;
//! For this point gives its three coordinates Xp, Yp and Zp.void Coord(Standard_Real& Xp,Standard_Real& Yp,Standard_Real& Zp) const;
//! For this point, returns its X coordinate.Standard_Real X() const;
//! For this point, returns its X coordinate.Standard_Real Y() const;
//! For this point, returns its X coordinate.Standard_Real Z() const;
//! For this point, returns its three coordinates as a number triple.const gp_XYZ& XYZ() const;
//! For this point, returns its three coordinates as a number triple.const gp_XYZ& Coord() const;
//! Returns the coordinates of this point.
//! Note: This syntax allows direct modification of the returned value.
gp_XYZ& ChangeCoord() ;
//! Assigns the result of the following expression to this point//! (Alpha*this + Beta*P) / (Alpha + Beta)
void BaryCenter(const Standard_Real Alpha,const gp_Pnt& P,const Standard_Real Beta) ;
//! Comparison//! Returns True if the distance between the two points is
//! lower or equal to LinearTolerance.
Standard_Boolean IsEqual(const gp_Pnt& Other,const Standard_Real LinearTolerance) const;
//! Computes the distance between two points.Standard_Real Distance(const gp_Pnt& Other) const;
//! Computes the square distance between two points.Standard_Real SquareDistance(const gp_Pnt& Other) const;
//! Performs the symmetrical transformation of a point
//! with respect to the point P which is the center of
//! the symmetry.
Standard_EXPORT void Mirror(const gp_Pnt& P) ;
//! Performs the symmetrical transformation of a point
//! with respect to an axis placement which is the axis
//! of the symmetry.
Standard_EXPORT gp_Pnt Mirrored(const gp_Pnt& P) const;
Standard_EXPORT void Mirror(const gp_Ax1& A1) ;
//! Performs the symmetrical transformation of a point
//! with respect to a plane. The axis placement A2 locates
//! the plane of the symmetry : (Location, XDirection, YDirection).
Standard_EXPORT gp_Pnt Mirrored(const gp_Ax1& A1) const;
Standard_EXPORT void Mirror(const gp_Ax2& A2) ;
//! Rotates a point. A1 is the axis of the rotation.
//! Ang is the angular value of the rotation in radians.
Standard_EXPORT gp_Pnt Mirrored(const gp_Ax2& A2) const;
void Rotate(const gp_Ax1& A1,const Standard_Real Ang) ;
//! Scales a point. S is the scaling value.gp_Pnt Rotated(const gp_Ax1& A1,const Standard_Real Ang) const;
void Scale(const gp_Pnt& P,const Standard_Real S) ;
//! Transforms a point with the transformation T.gp_Pnt Scaled(const gp_Pnt& P,const Standard_Real S) const;
Standard_EXPORT void Transform(const gp_Trsf& T) ;
//! Translates a point in the direction of the vector V.
//! The magnitude of the translation is the vector’s magnitude.
gp_Pnt Transformed(const gp_Trsf& T) const;
void Translate(const gp_Vec& V) ;
//! Translates a point from the point P1 to the point P2.
gp_Pnt Translated(const gp_Vec& V) const;
void Translate(const gp_Pnt& P1,const gp_Pnt& P2) ;
gp_Pnt Translated(const gp_Pnt& P1,const gp_Pnt& P2) const;
const gp_XYZ& _CSFDB_Getgp_Pntcoord() const { return coord; }// Type management
//
Standard_EXPORT friend Handle_Standard_Type& gp_Pnt_Type_();protected:
// Methods PROTECTED
//// Fields PROTECTED
//private:
// Methods PRIVATE
//// Fields PRIVATE
//
gp_XYZ coord;};
Hmm…
I added some breaklines in a Hline contructor function to see what happens when I draw a line in the sketcher….
I wasn’t really expecting this result. When I clicked on line to define the first point, this constructor fired.
HLine::HLine(const gp_Pnt &a, const gp_Pnt &b, const HeeksColor* col):EndedObject(col){
A->m_p = a;
B->m_p = b;
color = *col;
}
The call stack looks like this:
#0 ( HLine(this=0x853f4c8, a=…, b=…, col=0x849f060) (/home/jonas/HeeksCAD/src/HLine.cpp:23)
#1 0x817dab9 LineArcDrawing::calculate_item(this=0x8378c20, end=…) (/home/jonas/HeeksCAD/src/LineArcDrawing.cpp:295)
#2 0x80eedc5 Drawing::RecalculateAndRedraw(this=0x8378c20, point=…) (/home/jonas/HeeksCAD/src/Drawing.cpp:45)
#3 0x80ef35e Drawing::OnMouse(this=0x8378c20, event=…) (/home/jonas/HeeksCAD/src/Drawing.cpp:131)
#4 0x8107f70 CGraphicsCanvas::OnMouse(this=0x85d4320, event=…) (/home/jonas/HeeksCAD/src/GraphicsCanvas.cpp:319)
#5 0xb77c2a9f wxAppConsole::HandleEvent(wxEvtHandler*, void (wxEvtHandler::*)(wxEvent&) (/usr/lib/libwx_baseu-2.8.so.0:??)
#6 0xb7861209 wxEvtHandler::ProcessEventIfMatches(wxEventTableEntryBase const&, wxEvtHandler*, wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#7 0xb78622d4 wxEventHashTable::HandleEvent(wxEvent&, wxEvtHandler*) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#8 0xb78623d3 wxEvtHandler::ProcessEvent(wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#10 0xb7a4d40e ??() (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
#11 0xb3828424 ??() (/usr/lib/libgtk-x11-2.0.so.0:??)
#12 0xb343c252 g_closure_invoke() (/usr/lib/libgobject-2.0.so.0:??)
#13 0xb345099d ??() (/usr/lib/libgobject-2.0.so.0:??)
#14 0xb3451c33 g_signal_emit_valist() (/usr/lib/libgobject-2.0.so.0:??)
#15 0xb3452256 g_signal_emit() (/usr/lib/libgobject-2.0.so.0:??)
#16 0xb3955636 ??() (/usr/lib/libgtk-x11-2.0.so.0:??)
#17 0xb3820a5d gtk_propagate_event() (/usr/lib/libgtk-x11-2.0.so.0:??)
#18 0xb3821e07 gtk_main_do_event() (/usr/lib/libgtk-x11-2.0.so.0:??)
#19 0xb36ab39a ??() (/usr/lib/libgdk-x11-2.0.so.0:??)
#20 0xb338d5e5 g_main_context_dispatch() (/lib/libglib-2.0.so.0:??)
#21 0xb33912d8 ??() (/lib/libglib-2.0.so.0:??)
#22 0xb3391817 g_main_loop_run() (/lib/libglib-2.0.so.0:??)
#23 0xb38223c9 gtk_main() (/usr/lib/libgtk-x11-2.0.so.0:??)
#24 0xb7a38708 wxEventLoop::Run() () (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
#25 0xb7acb4de wxAppBase::MainLoop() () (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
#26 0xb7acb0d1 wxAppBase::OnRun() () (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
#27 0x814a61c HeeksCADapp::OnRun(this=0x849ef18) (/home/jonas/HeeksCAD/src/HeeksCAD.cpp:3139)
#28 0xb77fc79a wxEntry(int&, wchar_t**) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#29 0xb77fc977 wxEntry(int&, char**) () (/usr/lib/libwx_baseu-2.8.so.0:??)
After I ctrl F7’d code:blocks to continue I the second point would follow the cursor…. Hmm… whatever is going on it’s not the constructor thats firing… when I click the mouse the other constructor fires…
HLine::HLine(const HLine &line):EndedObject(&line.color){
operator=(line);
}
I think what going on is that I’m actually starting the second line which makes sense…
#0 ( HLine(this=0x85d6528, line=…) (/home/jonas/HeeksCAD/src/HLine.cpp:19)
#1 0x8129542 HLine::MakeACopy(this=0x8549138) (/home/jonas/HeeksCAD/src/HLine.cpp:135)
#2 0x807ef7d HeeksObj::MakeACopyWithID(this=0x8549138) (/home/jonas/HeeksCAD/interface/HeeksObj.cpp:53)
#3 0x80f651d EndedObject::MakeACopyWithID(this=0x8549138) (/home/jonas/HeeksCAD/src/EndedObject.cpp:39)
#4 0x8084f42 ObjList::copy_objects(this=0x878c990, objlist=…) (/home/jonas/HeeksCAD/interface/ObjList.cpp:70)
#5 0x8085010 ObjList::operator=(this=0x878c990, objlist=…) (/home/jonas/HeeksCAD/interface/ObjList.cpp:82)
#6 0x81e1fca CSketch::operator=(this=0x878c990, c=…) (/home/jonas/HeeksCAD/src/Sketch.cpp:58)
#7 0x81e1eb6 CSketch(this=0x878c990, c=…) (/home/jonas/HeeksCAD/src/Sketch.cpp:46)
#8 0x81e2c00 CSketch::MakeACopy(this=0x8776a00) (/home/jonas/HeeksCAD/src/Sketch.cpp:433)
#9 0x807ef7d HeeksObj::MakeACopyWithID(this=0x8776a00) (/home/jonas/HeeksCAD/interface/HeeksObj.cpp:53)
#10 0x81ff5fc UndoEngine::GetModificationsRecursive(this=0x84a54a0, ret=…, newtree=0x849ef74, oldtree=0x84a4eb8) (/home/jonas/HeeksCAD/src/UndoEngine.cpp:152)
#11 0x81ff3b7 UndoEngine::GetModifications(this=0x84a54a0, ret=…, newtree=0x849ef74, oldtree=0x84a4eb8) (/home/jonas/HeeksCAD/src/UndoEngine.cpp:113)
#12 0x81ff15a UndoEngine::GetModifications(this=0x84a54a0) (/home/jonas/HeeksCAD/src/UndoEngine.cpp:58)
#13 0x81ffe45 UndoEngine::IsModified(this=0x84a54a0) (/home/jonas/HeeksCAD/src/UndoEngine.cpp:246)
#14 0x8142093 HeeksCADapp::IsModified(this=0x849ef18) (/home/jonas/HeeksCAD/src/HeeksCAD.cpp:1798)
#15 0x8160b12 OnUpdateSave(event=…) (/home/jonas/HeeksCAD/src/HeeksFrame.cpp:753)
#16 0x8162a52 CHeeksFrame::OnUpdateExternalButton(this=0x8545bc8, event=…) (/home/jonas/HeeksCAD/src/HeeksFrame.cpp:1133)
#17 0xb77c2a9f wxAppConsole::HandleEvent(wxEvtHandler*, void (wxEvtHandler::*)(wxEvent&) (/usr/lib/libwx_baseu-2.8.so.0:??)
#18 0xb7861209 wxEvtHandler::ProcessEventIfMatches(wxEventTableEntryBase const&, wxEvtHandler*, wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#19 0xb78622d4 wxEventHashTable::HandleEvent(wxEvent&, wxEvtHandler*) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#20 0xb78623d3 wxEvtHandler::ProcessEvent(wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#21 0xb7862369 wxEvtHandler::ProcessEvent(wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#22 0xb7862369 wxEvtHandler::ProcessEvent(wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#23 0xb7862369 wxEvtHandler::ProcessEvent(wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#24 0xb7862369 wxEvtHandler::ProcessEvent(wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#25 0xb7b54e82 wxWindowBase::TryParent(wxEvent&) () (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
#26 0xb7862379 wxEvtHandler::ProcessEvent(wxEvent&) () (/usr/lib/libwx_baseu-2.8.so.0:??)
#27 0xb7b4b52d wxToolBarBase::UpdateWindowUI(long) () (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
#28 0xb7abf1f0 wxToolBar::OnInternalIdle() () (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
#29 0xb7acb415 wxAppBase::SendIdleEvents(wxWindow*, wxIdleEvent&) () (/usr/lib/libwx_gtk2u_core-2.8.so.0:??)
So… I’m getting an aha but I am Hmmm’g a bit
This “operator=(line);” got me a bit confused… I don’t understand whats going on there…
http://www.dreamincode.net/forums/topic/39051-operator-keyword/
clearing my other break points and andding one here. Lets see if I can figure it out.
#3 0x80f651d EndedObject::MakeACopyWithID(this=0x8549138) (/home/jonas/HeeksCAD/src/EndedObject.cpp:39)
Ugg…. This is about all I can handle for now… There be a hole bunch of stuff going on…..
I think what I need to do tomorrow is to load up a heek file that contains a single line to see if it makes more sense to me. I really need to understand what goes on with defining before I attempt a constraint.