// Move all contours in current object to new object void imodMoveAllContours(ImodView *vi, int obNew) { int co; Imod *imod = vi->imod; Iobj *obj = imodObjectGet(imod); // Just record an object property change since there may be max surface number changes // as well as the store info vi->undo->objectPropChg(); vi->undo->objectPropChg(obNew); // If object has mesh but no contours, transfers the meshes if (!obj->contsize && obj->meshsize) { for (co = 0; co < obj->meshsize; co++) imod->obj[obNew].mesh = imodel_mesh_add(&obj->mesh[co], imod->obj[obNew].mesh, &imod->obj[obNew].meshsize); return; } // Move all the fine grain information over then delete the store if (ilistSize(obj->store)) { for (co = 0; co <= obj->surfsize; co++) istoreCopyContSurfItems(obj->store, &imod->obj[obNew].store, co, co, 1); for (co = 0; co < obj->contsize; co++) istoreCopyContSurfItems(obj->store, &imod->obj[obNew].store, co, imod->obj[obNew].contsize + co, 0); ilistDelete(obj->store); obj->store = NULL; } // Record all contours as moving vi->undo->allContourMove(imod->cindex.object, obNew); /* DNM: need to set contour inside loop because each deletion sets it to -1; and need to not increment counter! */ for (co = 0; co < (int)obj->contsize; ) { imod->cindex.contour = 0; imodObjectAddContour(&imod->obj[obNew], &obj->cont[co]); imodObjectRemoveContour(obj, co); } }
/* This used to be called when moving all contours in an object but not anymore */ void imod_contour_move(int ob) { /* DNM2/13/03: remove oldpt, co, cont */ int oldob; int oldco; Iobj *obj; Iobj *olObj; Icont *ocont; ImodView *vi = App->cvi; Imod *imod = App->cvi->imod; oldob = imod->cindex.object; oldco = imod->cindex.contour; ocont = imodContourGet(imod); if (!ocont) return; if (ob == oldob) return; if (ob > imod->objsize) return; if (ob < 0) return; obj = &(imod->obj[ob]); olObj = &(imod->obj[oldob]); if (istoreCountContSurfItems(olObj->store, oldco, 0)) { vi->undo->objectPropChg(ob); istoreCopyContSurfItems(olObj->store, &obj->store, oldco, obj->contsize, 0); } vi->undo->contourMove(imod->cindex.object, 0, ob, obj->contsize); /* DNM: switch to this Add and Remove method to avoid problems with labels */ imodObjectAddContour(obj, ocont); imodObjectRemoveContour(olObj, oldco); /* DNM 3/29/01: delete old code. */ return; }
/* * Copy a single contour, cont, to the place it needs to go. * */ static int copyContour(Icont *cont, int coNum) { Iobj *toObj; int co,pt; int section; ImodView *vw = sData.vw; int obnum = vw->imod->cindex.object; if (!cont) return(-1); if (!cont->psize) return(-1); switch(sData.copyOperation){ case COPY_TO_OBJECT: obnum = sData.objectNumber - 1; toObj = &vw->imod->obj[obnum]; /* Don't copy if duplicate contour already exists. */ for(co = 0; co < toObj->contsize; co++){ if (contCompare(&toObj->cont[co], cont) == 0) return(0); } vbCleanupVBD(toObj); /* Remove duplicate points */ if (iobjScat(toObj->flags)){ for(co = 0; co < toObj->contsize; co++){ contRmDup(&toObj->cont[co], cont); } } vw->undo->contourAddition(obnum, toObj->contsize); imodObjectAddContour(toObj, cont); break; case COPY_TO_CURRENT: toObj = imodObjectGet(vw->imod); vw->undo->contourAddition(obnum, toObj->contsize); imodObjectAddContour(toObj, cont); break; case COPY_TO_SECTION: case COPY_TO_NEXT_SECTION: case COPY_TO_PREV_SECTION: toObj = &vw->imod->obj[sData.currentObject]; section = sData.sectionNumber-1; for(pt = 0; pt < cont->psize; pt++){ cont->pts[pt].z = section; } vw->undo->contourAddition(sData.currentObject, toObj->contsize); imodObjectAddContour(toObj, cont); break; case COPY_TO_TIME: case COPY_TO_NEXT_TIME: toObj = &vw->imod->obj[sData.currentObject]; cont->time = sData.timeIndex; vw->undo->contourAddition(sData.currentObject, toObj->contsize); imodObjectAddContour(toObj, cont); break; } // Copy any contour properties from source to destination object if (istoreCountContSurfItems(vw->imod->obj[sData.currentObject].store, coNum, 0)) { vw->undo->objectPropChg(obnum); istoreCopyContSurfItems(vw->imod->obj[sData.currentObject].store, &toObj->store, coNum, toObj->contsize - 1, 0); } return(0); }