00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 #include "camtypes.h"
00103 #include "shapeops.h"
00104
00105
00106 #include "blobs.h"
00107 #include "csrstack.h"
00108
00109 #include "nodepath.h"
00110 #include "nodershp.h"
00111 #include "pathedit.h"
00112
00113 #include "progress.h"
00114
00115
00116
00117
00118
00119 #include "objchge.h"
00120
00121
00122 #define PATRACE if(IsUserName("Peter")) TRACE
00123
00124
00125
00126
00127
00128 #define PACLASSNAME(a,b) CCRuntimeClass* Blob; Blob = a->GetRuntimeClass(); PATRACE(b,Blob->m_lpszClassName)
00129
00130
00131 DECLARE_SOURCE( "$Revision: 1776 $" );
00132
00133
00134 CC_IMPLEMENT_MEMDUMP(EditRegularShapeParam, OpParam)
00135 CC_IMPLEMENT_DYNCREATE(OpEditRegularShape, SelOperation)
00136 CC_IMPLEMENT_DYNCREATE(OpDragRegularShape, SelOperation)
00137 CC_IMPLEMENT_DYNCREATE(OpReformShapeEdge, SelOperation)
00138 CC_IMPLEMENT_DYNCREATE(ChangeShapeDataAction, Action)
00139 CC_IMPLEMENT_DYNCREATE(ChangeShapePointAction, Action)
00140 CC_IMPLEMENT_DYNCREATE(ChangeShapePathAction, Action)
00141 CC_IMPLEMENT_DYNAMIC(ShapeEditedMsg, Msg)
00142 CC_IMPLEMENT_DYNCREATE(OpShapeToggleBase, SelOperation)
00143 CC_IMPLEMENT_DYNCREATE(OpShapeToggleElipPoly, OpShapeToggleBase)
00144 CC_IMPLEMENT_DYNCREATE(OpShapeToggleStellation, OpShapeToggleBase)
00145 CC_IMPLEMENT_DYNCREATE(OpShapeToggleCurvature, OpShapeToggleBase)
00146 CC_IMPLEMENT_DYNCREATE(OpShapeMakeRegular, SelOperation)
00147
00148 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides, SelOperation )
00149 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides3, OpShapeToggleSetNumSides )
00150 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides4, OpShapeToggleSetNumSides )
00151 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides5, OpShapeToggleSetNumSides )
00152 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides6, OpShapeToggleSetNumSides )
00153 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides7, OpShapeToggleSetNumSides )
00154 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides8, OpShapeToggleSetNumSides )
00155 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides9, OpShapeToggleSetNumSides )
00156 CC_IMPLEMENT_DYNCREATE( OpShapeToggleSetNumSides10, OpShapeToggleSetNumSides )
00157
00158
00159
00160
00161 #define new CAM_DEBUG_NEW
00162
00163 const DocCoord DontCare (0,0);
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 ShapeEditedMsg::ShapeEditedMsg(NodeRegularShape* pChangeShape, Spread* pParentSpread)
00178 {
00179 pShape = pChangeShape;
00180 pSpread = pParentSpread;
00181 }
00182
00183
00185
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 EditRegularShapeParam::EditRegularShapeParam(NodeRegularShape* ChangeShapes)
00203 {
00204 ShapeToChange = ChangeShapes;
00205 ShapesToAffect = AFFECT_ALL;
00206
00207 NewEdgePath1 = NULL;
00208 NewEdgePath2 = NULL;
00209 NewNumSides = 0;
00210 NewCircular = CHANGE_DONTCARE;
00211 NewStellated = CHANGE_DONTCARE;
00212 NewPrimaryCurvature = CHANGE_DONTCARE;
00213 NewStellationCurvature = CHANGE_DONTCARE;
00214 NewStellRadiusToPrimary = -1.0;
00215 NewPrimaryCurveToPrimary = -1.0;
00216 NewStellCurveToStell = -1.0;
00217 NewStellOffsetRatio = -1000.0;
00218
00219
00220
00221
00222 TranslateTo = DontCare;
00223 TranslateBy = DontCare;
00224 SetRadiusLength = -1;
00225 AddRadiusLength = -1;
00226 RotateTo = -1000.0;
00227 RotateBy = -1000.0;
00228 SetStellationLength = -1;
00229 AddStellationLength = -1;
00230 SetStellationOffset = -1000.0;
00231 AddStellationOffset = -1000.0;
00232 AddPrimaryCurvature = 0.0;
00233 AddStellationCurvature = 0.0;
00234 SetMajorAxisLength = 0;
00235 AddMajorAxisLength = 0;
00236 SetMinorAxisLength = 0;
00237 AddMinorAxisLength = 0;
00238 }
00239
00240
00241
00243
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 OpEditRegularShape::OpEditRegularShape(): SelOperation()
00256 {
00257 }
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 BOOL OpEditRegularShape::Init()
00276 {
00277 BOOL Success = RegisterOpDescriptor(0,
00278 _R(IDS_EDITREGULARSHAPEOP),
00279 CC_RUNTIME_CLASS(OpEditRegularShape),
00280 OPTOKEN_EDITREGULARSHAPE,
00281 OpEditRegularShape::GetState);
00282
00283 if (Success)
00284 Success = OpShapeToggleElipPoly::Init();
00285 if (Success)
00286 Success = OpShapeToggleStellation::Init();
00287 if (Success)
00288 Success = OpShapeToggleCurvature::Init();
00289 if (Success)
00290 Success = OpShapeToggleSetNumSides::Init();
00291 if (Success)
00292 Success = OpShapeMakeRegular::Init();
00293
00294 return Success;
00295 }
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 OpState OpEditRegularShape::GetState(String_256* UIDescription, OpDescriptor*)
00311 {
00312 OpState OpSt;
00313
00314 return OpSt;
00315 }
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332 void OpEditRegularShape::DoWithParam(OpDescriptor* pOpDesc, OpParam* pEntryOpParam)
00333 {
00334 EditRegularShapeParam* pOpParam = (EditRegularShapeParam*)pEntryOpParam;
00335
00336
00337 if (DoStartSelOp(FALSE))
00338 {
00339 BOOL Complete = TRUE;
00340
00341
00342 ObjChangeFlags cFlags;
00343 ObjChangeParam ObjChange(OBJCHANGE_STARTING,cFlags,NULL,this);
00344
00345
00346 if (pOpParam->ShapeToChange != NULL)
00347 {
00348 if (ShouldDoThisShape(pOpParam->ShapeToChange, pOpParam->ShapesToAffect))
00349 {
00350 if (pOpParam->ShapeToChange->AllowOp(&ObjChange))
00351 Complete = CarryOut(pOpParam->ShapeToChange, pOpParam);
00352 }
00353 }
00354 else
00355 {
00356
00357 SelRange* Selected = GetApplication()->FindSelection();
00358 Node* pNode = Selected->FindFirst();
00359
00360 while ((pNode != NULL) && Complete)
00361 {
00362 if (IS_A(pNode,NodeRegularShape))
00363 {
00364 if (ShouldDoThisShape((NodeRegularShape*)pNode, pOpParam->ShapesToAffect))
00365 {
00366 if (pNode->AllowOp(&ObjChange))
00367 Complete = CarryOut((NodeRegularShape*)pNode, pOpParam);
00368 }
00369 }
00370 pNode = Selected->FindNext(pNode);
00371 }
00372 }
00373
00374 GetApplication()->FindSelection()->Update(FALSE);
00375
00376 if (Complete)
00377 {
00378
00379 ObjChange.Define(OBJCHANGE_FINISHED,cFlags,NULL,this);
00380 Complete = UpdateChangedNodes(&ObjChange);
00381 }
00382
00383
00384 if (!Complete)
00385 {
00386 FailAndExecute();
00387 }
00388 }
00389 else
00390 {
00391 FailAndExecute();
00392 }
00393
00394 End();
00395 }
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 BOOL OpEditRegularShape::CarryOut(NodeRegularShape* ShapeToEdit, EditRegularShapeParam* NewShapeData)
00414 {
00415
00416 if (RecalcBoundsAction::DoRecalc(this, &UndoActions, ShapeToEdit) == AC_FAIL)
00417 {
00418 return FALSE;
00419 }
00420
00421
00422 if (NewShapeData->NewCircular != EditRegularShapeParam::CHANGE_DONTCARE)
00423 {
00424 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit, ChangeShapeDataAction::CHANGE_CIRCULAR,
00425 ShapeToEdit->IsCircular() ? 1.0 : 0.0) == AC_FAIL)
00426 {
00427 return FALSE;
00428 }
00429 ShapeToEdit->SetCircular(NewShapeData->NewCircular == EditRegularShapeParam::CHANGE_SETTRUE);
00430 }
00431
00432
00433 if (NewShapeData->NewStellated != EditRegularShapeParam::CHANGE_DONTCARE)
00434 {
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit, ChangeShapeDataAction::CHANGE_STELLATED,
00452 ShapeToEdit->IsStellated() ? 1.0 : 0.0) == AC_FAIL)
00453 {
00454 return FALSE;
00455 }
00456 ShapeToEdit->SetStellated(NewShapeData->NewStellated == EditRegularShapeParam::CHANGE_SETTRUE);
00457 }
00458
00459
00460 if (NewShapeData->NewPrimaryCurvature != EditRegularShapeParam::CHANGE_DONTCARE)
00461 {
00462 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit, ChangeShapeDataAction::CHANGE_PRIMARYCURVATURE,
00463 ShapeToEdit->IsPrimaryCurvature() ? 1.0 : 0.0) == AC_FAIL)
00464 {
00465 return FALSE;
00466 }
00467 ShapeToEdit->SetPrimaryCurvature(NewShapeData->NewPrimaryCurvature == EditRegularShapeParam::CHANGE_SETTRUE);
00468 }
00469
00470
00471 if (NewShapeData->NewStellationCurvature != EditRegularShapeParam::CHANGE_DONTCARE)
00472 {
00473 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit, ChangeShapeDataAction::CHANGE_STELLATIONCURVATURE,
00474 ShapeToEdit->IsStellationCurvature() ? 1.0 : 0.0) == AC_FAIL)
00475 {
00476 return FALSE;
00477 }
00478 ShapeToEdit->SetStellationCurvature(NewShapeData->NewStellationCurvature == EditRegularShapeParam::CHANGE_SETTRUE);
00479 }
00480
00481
00482 if (NewShapeData->NewStellOffsetRatio != -1000.0)
00483 {
00484 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00485 ChangeShapeDataAction::CHANGE_STELLATIONOFFSET, ShapeToEdit->GetStellationRatio()) == AC_FAIL)
00486 {
00487 return FALSE;
00488 }
00489 ShapeToEdit->SetStellationRatio(NewShapeData->NewStellOffsetRatio);
00490 }
00491
00492
00493 if (NewShapeData->NewNumSides != 0)
00494 {
00495 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00496 ChangeShapeDataAction::CHANGE_NUMSIDES, ShapeToEdit->GetNumSides()) == AC_FAIL)
00497 {
00498 return FALSE;
00499 }
00500 ShapeToEdit->SetNumSides(NewShapeData->NewNumSides);
00501 }
00502
00503
00504 if (NewShapeData->NewStellRadiusToPrimary != -1.0)
00505 {
00506 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00507 ChangeShapeDataAction::CHANGE_STELLRADIUSTOPRIMARY,
00508 ShapeToEdit->GetStellRadiusToPrimary()) == AC_FAIL)
00509 {
00510 return FALSE;
00511 }
00512 ShapeToEdit->SetStellRadiusToPrimary(NewShapeData->NewStellRadiusToPrimary);
00513 }
00514
00515
00516 if (NewShapeData->NewPrimaryCurveToPrimary != -1.0)
00517 {
00518 double NewRatio = NewShapeData->NewPrimaryCurveToPrimary;
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00533 ChangeShapeDataAction::CHANGE_PRIMARYCURVETOPRIMARY,
00534 ShapeToEdit->GetPrimaryCurveToPrimary()) == AC_FAIL)
00535 {
00536 return FALSE;
00537 }
00538 ShapeToEdit->SetPrimaryCurveToPrimary(NewRatio);
00539 }
00540
00541
00542 if (NewShapeData->AddPrimaryCurvature != -0.0)
00543 {
00544 double NewRatio = ShapeToEdit->GetPrimaryCurveToPrimary() + NewShapeData->AddPrimaryCurvature;
00545
00546
00547
00548
00549
00550
00551
00552
00553 NewRatio = max( 0.0, NewRatio );
00554
00555 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00556 ChangeShapeDataAction::CHANGE_PRIMARYCURVETOPRIMARY,
00557 ShapeToEdit->GetPrimaryCurveToPrimary()) == AC_FAIL)
00558 {
00559 return FALSE;
00560 }
00561 ShapeToEdit->SetPrimaryCurveToPrimary(NewRatio);
00562 }
00563
00564
00565 if (NewShapeData->NewStellCurveToStell != -1.0)
00566 {
00567 double NewRatio = NewShapeData->NewStellCurveToStell;
00568
00569
00570
00571 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00572 ChangeShapeDataAction::CHANGE_STELLCURVETOSTELL,
00573 ShapeToEdit->GetStellCurveToStell()) == AC_FAIL)
00574 {
00575 return FALSE;
00576 }
00577 ShapeToEdit->SetStellCurveToStell(NewRatio);
00578 }
00579
00580
00581 if (NewShapeData->AddStellationCurvature != 0.0)
00582 {
00583 double NewRatio = ShapeToEdit->GetStellCurveToStell() + NewShapeData->AddStellationCurvature;
00584
00585 NewRatio = max( 0.0, NewRatio );
00586
00587 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00588 ChangeShapeDataAction::CHANGE_PRIMARYCURVETOPRIMARY,
00589 ShapeToEdit->GetStellCurveToStell()) == AC_FAIL)
00590 {
00591 return FALSE;
00592 }
00593 ShapeToEdit->SetStellCurveToStell(NewRatio);
00594 }
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620 if ((NewShapeData->SetRadiusLength != -1) || (NewShapeData->AddRadiusLength != -1) )
00621 {
00622
00623 fixed16 ScaleFactor;
00624 const double CurrentLength = ShapeToEdit->GetCentrePoint().Distance(ShapeToEdit->GetMajorAxes()) ;
00625 if (CurrentLength != 0.0)
00626 {
00627 if (NewShapeData->SetRadiusLength != -1)
00628 {
00629 double RequiredLength = NewShapeData->SetRadiusLength;
00630 ScaleFactor = RequiredLength / CurrentLength;
00631 }
00632 else
00633 {
00634 double RequiredAddition = NewShapeData->AddRadiusLength;
00635 ScaleFactor = (RequiredAddition + CurrentLength) / CurrentLength;
00636 }
00637 }
00638 else
00639 ScaleFactor = 1.0;
00640
00641
00642 Trans2DMatrix* TransOriginMat = new Trans2DMatrix(-ShapeToEdit->GetCentrePoint().x, -ShapeToEdit->GetCentrePoint().y);
00643 Trans2DMatrix* ScaleMat = new Trans2DMatrix(Matrix(ScaleFactor,ScaleFactor));
00644 Trans2DMatrix* TransBackMat = new Trans2DMatrix(ShapeToEdit->GetCentrePoint().x, ShapeToEdit->GetCentrePoint().y);
00645 if (!(DoTransformNode(ShapeToEdit, TransOriginMat) && DoTransformNode(ShapeToEdit, ScaleMat)
00646 && DoTransformNode(ShapeToEdit, TransBackMat) ))
00647 {
00648 return FALSE;
00649 }
00650 }
00651
00652
00653
00654 if ((NewShapeData->SetMajorAxisLength != 0) || (NewShapeData->AddMajorAxisLength != 0) )
00655 {
00656
00657 fixed16 ScaleFactor;
00658 const double CurrentLength = ShapeToEdit->GetCentrePoint().Distance(ShapeToEdit->GetMajorAxes()) ;
00659 if (CurrentLength != 0.0)
00660 {
00661 if (NewShapeData->SetMajorAxisLength != 0)
00662 {
00663 double RequiredLength = NewShapeData->SetMajorAxisLength;
00664 ScaleFactor = RequiredLength / CurrentLength;
00665 }
00666 else
00667 {
00668 double RequiredAddition = NewShapeData->AddMajorAxisLength;
00669 ScaleFactor = (RequiredAddition + CurrentLength) / CurrentLength;
00670 }
00671 }
00672 else
00673 ScaleFactor = 1.0;
00674
00675 if (ChangeShapePointAction::DoToggle(this, &UndoActions, ShapeToEdit,
00676 ChangeShapePointAction::CHANGE_MAJOR, ShapeToEdit->GetUTMajorAxes()) == AC_FAIL)
00677 {
00678 return FALSE;
00679 }
00680
00681
00682 Matrix ScaleMatrix(FIXED16(1.0), ScaleFactor);
00683 DocCoord Offset = ShapeToEdit->GetUTMajorAxes() - ShapeToEdit->GetUTCentrePoint();
00684 ScaleMatrix.transform(&Offset);
00685 ShapeToEdit->SetMajorAxes(ShapeToEdit->GetUTCentrePoint() + Offset);
00686 }
00687
00688
00689
00690 if ((NewShapeData->SetMinorAxisLength != 0) || (NewShapeData->AddMinorAxisLength != 0) )
00691 {
00692
00693 fixed16 ScaleFactor;
00694 const double CurrentLength = ShapeToEdit->GetCentrePoint().Distance(ShapeToEdit->GetMinorAxes()) ;
00695 if (CurrentLength != 0.0)
00696 {
00697 if (NewShapeData->SetMinorAxisLength != 0)
00698 {
00699 double RequiredLength = NewShapeData->SetMinorAxisLength;
00700 ScaleFactor = RequiredLength / CurrentLength;
00701 }
00702 else
00703 {
00704 double RequiredAddition = NewShapeData->AddMinorAxisLength;
00705 ScaleFactor = (RequiredAddition + CurrentLength) / CurrentLength;
00706 }
00707 }
00708 else
00709 ScaleFactor = 1.0;
00710
00711 if (ChangeShapePointAction::DoToggle(this, &UndoActions, ShapeToEdit,
00712 ChangeShapePointAction::CHANGE_MINOR, ShapeToEdit->GetUTMinorAxes()) == AC_FAIL)
00713 {
00714 return FALSE;
00715 }
00716
00717
00718 Matrix ScaleMatrix(ScaleFactor, FIXED16(1.0));
00719 DocCoord Offset = ShapeToEdit->GetUTMinorAxes() - ShapeToEdit->GetUTCentrePoint();
00720 ScaleMatrix.transform(&Offset);
00721 ShapeToEdit->SetMinorAxes(ShapeToEdit->GetUTCentrePoint() + Offset);
00722 }
00723
00724
00725
00726 if ((NewShapeData->SetStellationLength != -1) || (NewShapeData->AddStellationLength != -1) )
00727 {
00728 const double CurrentLength = ShapeToEdit->GetCentrePoint().Distance(ShapeToEdit->GetMajorAxes()) ;
00729 double NewRatio;
00730 if (NewShapeData->SetStellationLength != -1)
00731 {
00732
00733 NewRatio = double( min( fabs( NewShapeData->SetStellationLength / CurrentLength ), 1.0 ) );
00734 }
00735 else
00736 {
00737 double NewLength = fabs(CurrentLength - NewShapeData->AddStellationLength);
00738 NewRatio = double( min( fabs( ( NewLength / CurrentLength ) - 1 + ShapeToEdit->GetStellRadiusToPrimary() ), 1.0 ) );
00739 }
00740
00741 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00742 ChangeShapeDataAction::CHANGE_STELLRADIUSTOPRIMARY,
00743 ShapeToEdit->GetStellRadiusToPrimary()) == AC_FAIL)
00744 {
00745 return FALSE;
00746 }
00747 ShapeToEdit->SetStellRadiusToPrimary(NewRatio);
00748 }
00749
00750
00751
00752 if ((NewShapeData->RotateTo != -1000.0) || (NewShapeData->RotateBy != -1000.0) )
00753 {
00754
00755 ANGLE RotateBy;
00756 const DocCoord MajorOrigin = ShapeToEdit->GetMajorAxes() - ShapeToEdit->GetCentrePoint();
00757 const double CurrentAngle = atan2((double)MajorOrigin.y, (double)MajorOrigin.x) ;
00758 if (NewShapeData->RotateTo != -1000.0)
00759 {
00760 RotateBy = -(CurrentAngle - NewShapeData->RotateTo) * (180/PI);
00761 }
00762 else
00763 {
00764 RotateBy = NewShapeData->RotateBy * (180/PI);
00765 }
00766
00767 Trans2DMatrix* RotateMat = new Trans2DMatrix(ShapeToEdit->GetCentrePoint(), RotateBy);
00768 if (!DoTransformNode(ShapeToEdit, RotateMat))
00769 {
00770 return FALSE;
00771 }
00772 }
00773
00774
00775
00776 if ((NewShapeData->SetStellationOffset != -1000.0) || (NewShapeData->AddStellationOffset != -1000.0) )
00777 {
00778 const UINT32 NumSides = ShapeToEdit->GetNumSides();
00779 const double OppositeRatio = 180.0/(360.0/NumSides);
00780 double NewRatio;
00781 if (NewShapeData->SetStellationOffset != -1000.0)
00782 {
00783 NewRatio = OppositeRatio * (NewShapeData->SetStellationOffset / 180.0);
00784 }
00785 else
00786 {
00787 double NewOffset = (ShapeToEdit->GetStellationRatio()/OppositeRatio)*180.0 + NewShapeData->AddStellationOffset;
00788
00789 if (NewOffset < -180.0)
00790 NewOffset = 180.0 + (NewOffset + 180.0);
00791 if (NewOffset > 180.0)
00792 NewOffset = -180.0 + (NewOffset - 180.0);
00793 NewRatio = OppositeRatio * (NewOffset / 180.0);
00794 }
00795
00796 if (ChangeShapeDataAction::DoToggle(this, &UndoActions, ShapeToEdit,
00797 ChangeShapeDataAction::CHANGE_STELLATIONOFFSET, ShapeToEdit->GetStellationRatio()) == AC_FAIL)
00798 {
00799 return FALSE;
00800 }
00801 ShapeToEdit->SetStellationRatio(NewRatio);
00802 }
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816 if (NewShapeData->TranslateTo != DontCare)
00817 {
00818 DocCoord Offset = NewShapeData->TranslateTo - ShapeToEdit->GetCentrePoint() ;
00819
00820 Trans2DMatrix* TransMat = new Trans2DMatrix(Offset.x, Offset.y);
00821 if (!DoTransformNode(ShapeToEdit, TransMat))
00822 return FALSE;
00823 }
00824
00825
00826 if (NewShapeData->TranslateBy != DontCare)
00827 {
00828 Trans2DMatrix* TransMat = new Trans2DMatrix(NewShapeData->TranslateBy.x, NewShapeData->TranslateBy.y);
00829 if (!DoTransformNode(ShapeToEdit, TransMat))
00830 return FALSE;
00831 }
00832
00833
00834 if (NewShapeData->NewEdgePath1 != NULL)
00835 {
00836 if (ChangeShapePathAction::DoReshape(this, &UndoActions, ShapeToEdit,
00837 ChangeShapePathAction::CHANGE_PATH1, &(ShapeToEdit->EdgePath1)) == AC_FAIL)
00838 {
00839 return FALSE;
00840 }
00841 ShapeToEdit->EdgePath1.ClearPath();
00842 ShapeToEdit->EdgePath1.CopyPathDataFrom(NewShapeData->NewEdgePath1);
00843 }
00844
00845
00846 if (NewShapeData->NewEdgePath2 != NULL)
00847 {
00848 if (ChangeShapePathAction::DoReshape(this, &UndoActions, ShapeToEdit,
00849 ChangeShapePathAction::CHANGE_PATH2, &(ShapeToEdit->EdgePath2)) == AC_FAIL)
00850 {
00851 return FALSE;
00852 }
00853 ShapeToEdit->EdgePath2.ClearPath();
00854 ShapeToEdit->EdgePath2.CopyPathDataFrom(NewShapeData->NewEdgePath2);
00855 }
00856
00857
00858 ShapeToEdit->InvalidateBoundingRect();
00859 ShapeToEdit->InvalidateCache();
00860
00861
00862 if (RecordBoundsAction::DoRecord(this, &UndoActions, ShapeToEdit) == AC_FAIL)
00863 {
00864 return FALSE;
00865 }
00866
00867 return TRUE;
00868 }
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889 BOOL OpEditRegularShape::ShouldDoThisShape(NodeRegularShape* pShape, EditRegularShapeParam::AffectShape Allowance)
00890 {
00891 ERROR2IF(pShape == NULL, FALSE, "Can't edit a NULL shape!");
00892
00893 switch (Allowance)
00894 {
00895 case EditRegularShapeParam::AFFECT_ALL:
00896 return TRUE;
00897 break;
00898 case EditRegularShapeParam::AFFECT_ELLIPSES:
00899 return pShape->IsCircular();
00900 break;
00901 case EditRegularShapeParam::AFFECT_RECTANGLES:
00902 return (!pShape->IsCircular() && (pShape->GetNumSides() == 4) );
00903 break;
00904 default:
00905 ERROR3("Allowance was not known");
00906 return FALSE;
00907 }
00908 }
00909
00910
00911
00912
00914
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932 ChangeShapeDataAction::ChangeShapeDataAction()
00933 {
00934 pToggleShape = NULL;
00935 ChangeItemID = CHANGE_NUMSIDES;
00936 NewValue = 0.0;
00937 }
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971 ActionCode ChangeShapeDataAction::Init( Operation* pOp,
00972 ActionList* pActionList,
00973 NodeRegularShape* pShape,
00974 enum ChangeItem NewItem,
00975 double NewData,
00976 Action** NewAction)
00977 {
00978 UINT32 ActSize = sizeof(ChangeShapeDataAction);
00979
00980 ActionCode Ac = Action::Init( pOp, pActionList, ActSize, CC_RUNTIME_CLASS(ChangeShapeDataAction), NewAction);
00981 if ((Ac == AC_OK) && (*NewAction != NULL))
00982 {
00983 ((ChangeShapeDataAction*)*NewAction)->pToggleShape = pShape;
00984 ((ChangeShapeDataAction*)*NewAction)->ChangeItemID = NewItem;
00985 ((ChangeShapeDataAction*)*NewAction)->NewValue = NewData;
00986 }
00987 return Ac;
00988 }
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016 ActionCode ChangeShapeDataAction::DoToggle(Operation* pOp,
01017 ActionList* pActionList,
01018 NodeRegularShape* pShape,
01019 enum ChangeItem NewItem,
01020 double NewData)
01021 {
01022
01023 ChangeShapeDataAction* NewAction;
01024
01025
01026 ActionCode Act = ChangeShapeDataAction::Init(pOp, pActionList, pShape, NewItem, NewData, (Action**)&NewAction);
01027 return Act;
01028 }
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048 ActionCode ChangeShapeDataAction::Execute()
01049 {
01050 ERROR3IF(pToggleShape == NULL, "Pointer to shape was NULL. Did you call Init/DoToggle OR handle their failure?");
01051
01052
01053 ChangeShapeDataAction *ReAction;
01054 ActionCode Act = AC_FAIL;
01055 double ReData = 0.0;
01056
01057 switch (ChangeItemID)
01058 {
01059 case CHANGE_NUMSIDES:
01060 ReData = pToggleShape->GetNumSides();
01061 break;
01062 case CHANGE_CIRCULAR:
01063 ReData = pToggleShape->IsCircular() ? 1.0 : 0.0;
01064 break;
01065 case CHANGE_STELLATED:
01066 ReData = pToggleShape->IsStellated() ? 1.0 : 0.0;
01067 break;
01068 case CHANGE_STELLRADIUSTOPRIMARY:
01069 ReData = pToggleShape->GetStellRadiusToPrimary();
01070 break;
01071 case CHANGE_PRIMARYCURVATURE:
01072 ReData = pToggleShape->IsPrimaryCurvature() ? 1.0 : 0.0;
01073 break;
01074 case CHANGE_STELLATIONCURVATURE:
01075 ReData = pToggleShape->IsStellationCurvature() ? 1.0 : 0.0;
01076 break;
01077 case CHANGE_PRIMARYCURVETOPRIMARY:
01078 ReData = pToggleShape->GetPrimaryCurveToPrimary();
01079 break;
01080 case CHANGE_STELLCURVETOSTELL:
01081 ReData = pToggleShape->GetStellCurveToStell();
01082 break;
01083 case CHANGE_STELLATIONOFFSET:
01084 ReData = pToggleShape->GetStellationRatio();
01085 break;
01086 default:
01087 ERROR2(Act, "What was that Change ID?!");
01088 break;
01089 }
01090
01091
01092 if (pToggleShape != NULL)
01093 {
01094 Act = ChangeShapeDataAction::Init(pOperation, pOppositeActLst, pToggleShape, ChangeItemID,
01095 ReData, (Action**)(&ReAction));
01096
01097 if (Act == AC_FAIL)
01098 return AC_FAIL;
01099
01100
01101 switch (ChangeItemID)
01102 {
01103 case CHANGE_NUMSIDES:
01104 pToggleShape->SetNumSides((UINT32)NewValue);
01105 break;
01106 case CHANGE_CIRCULAR:
01107 pToggleShape->SetCircular(NewValue == 1.0 ? TRUE : FALSE);
01108 break;
01109 case CHANGE_STELLATED:
01110 pToggleShape->SetStellated(NewValue == 1.0 ? TRUE : FALSE);
01111 break;
01112 case CHANGE_STELLRADIUSTOPRIMARY:
01113 pToggleShape->SetStellRadiusToPrimary(NewValue);
01114 break;
01115 case CHANGE_PRIMARYCURVATURE:
01116 pToggleShape->SetPrimaryCurvature(NewValue == 1.0 ?