Copy any constraints that only refer to entities in the clipboard.

This commit is contained in:
whitequark 2015-12-30 20:36:31 +08:00
parent 869404a8ec
commit 818436c57d
2 changed files with 49 additions and 25 deletions

View File

@ -11,28 +11,38 @@ void SolveSpaceUI::Clipboard::Clear(void) {
r.Clear(); r.Clear();
} }
hEntity SolveSpaceUI::Clipboard::NewEntityFor(hEntity he) { bool SolveSpaceUI::Clipboard::ContainsEntity(hEntity he) {
if(he.v == Entity::NO_ENTITY.v)
return true;
ClipboardRequest *cr; ClipboardRequest *cr;
for(cr = r.First(); cr; cr = r.NextAfter(cr)) { for(cr = r.First(); cr; cr = r.NextAfter(cr)) {
if(cr->oldEnt.v == he.v) { if(cr->oldEnt.v == he.v)
return cr->newReq.entity(0); return true;
}
for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) { for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) {
if(cr->oldPointEnt[i].v == he.v) { if(cr->oldPointEnt[i].v == he.v)
return true;
}
}
return false;
}
hEntity SolveSpaceUI::Clipboard::NewEntityFor(hEntity he) {
if(he.v == Entity::NO_ENTITY.v)
return Entity::NO_ENTITY;
ClipboardRequest *cr;
for(cr = r.First(); cr; cr = r.NextAfter(cr)) {
if(cr->oldEnt.v == he.v)
return cr->newReq.entity(0);
for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) {
if(cr->oldPointEnt[i].v == he.v)
return cr->newReq.entity(1+i); return cr->newReq.entity(1+i);
} }
} }
} oops();
return Entity::NO_ENTITY;
}
bool SolveSpaceUI::Clipboard::ContainsEntity(hEntity he) {
hEntity hen = NewEntityFor(he);
if(hen.v) {
return true;
} else {
return false;
}
} }
void GraphicsWindow::DeleteSelection(void) { void GraphicsWindow::DeleteSelection(void) {
@ -109,10 +119,12 @@ void GraphicsWindow::CopySelection(void) {
Constraint *c; Constraint *c;
for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) {
if(c->type == Constraint::POINTS_COINCIDENT) { if(!SS.clipboard.ContainsEntity(c->ptA) ||
if(!SS.clipboard.ContainsEntity(c->ptA)) continue; !SS.clipboard.ContainsEntity(c->ptB) ||
if(!SS.clipboard.ContainsEntity(c->ptB)) continue; !SS.clipboard.ContainsEntity(c->entityA) ||
} else { !SS.clipboard.ContainsEntity(c->entityB) ||
!SS.clipboard.ContainsEntity(c->entityC) ||
!SS.clipboard.ContainsEntity(c->entityD)) {
continue; continue;
} }
SS.clipboard.c.Add(c); SS.clipboard.c.Add(c);
@ -172,12 +184,24 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) {
} }
} }
Constraint *c; Constraint *cc;
for(c = SS.clipboard.c.First(); c; c = SS.clipboard.c.NextAfter(c)) { for(cc = SS.clipboard.c.First(); cc; cc = SS.clipboard.c.NextAfter(cc)) {
if(c->type == Constraint::POINTS_COINCIDENT) { Constraint c = {};
Constraint::ConstrainCoincident(SS.clipboard.NewEntityFor(c->ptA), c.group = SS.GW.activeGroup;
SS.clipboard.NewEntityFor(c->ptB)); c.workplane = SS.GW.ActiveWorkplane();
} c.type = cc->type;
c.valA = cc->valA;
c.ptA = SS.clipboard.NewEntityFor(cc->ptA);
c.ptB = SS.clipboard.NewEntityFor(cc->ptB);
c.entityA = SS.clipboard.NewEntityFor(cc->entityA);
c.entityB = SS.clipboard.NewEntityFor(cc->entityB);
c.entityC = SS.clipboard.NewEntityFor(cc->entityC);
c.entityD = SS.clipboard.NewEntityFor(cc->entityD);
c.other = cc->other;
c.other2 = cc->other2;
c.reference = cc->reference;
c.disp = cc->disp;
Constraint::AddConstraint(&c);
} }
SS.ScheduleGenerateAll(); SS.ScheduleGenerateAll();

View File

@ -893,7 +893,7 @@ public:
} justExportedInfo; } justExportedInfo;
class Clipboard { class Clipboard {
public: public:
List<ClipboardRequest> r; List<ClipboardRequest> r;
List<Constraint> c; List<Constraint> c;