MeVisLabToolboxReference
MeVisLab/Standard/Sources/Inventor/SoCSO/CSOProcessor/CSOModifyProcessor/CSOModifyProcessor.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //----------------------------------------------------------------------------------
00004 
00009 //----------------------------------------------------------------------------------
00010 
00011 #ifndef __CSOModifyProcessor_H
00012 #define __CSOModifyProcessor_H
00013 
00014 
00015 #include "SoCSOSystem.h"
00016 #include "CSOProcessor/CSOProcessor.h"
00017 
00018 ML_START_NAMESPACE
00019 
00021 
00023 enum ModProcLimitUnits {
00024   ModProcLimitNumPoints = 0, 
00025   ModProcLimitSMM       = 1, 
00026   ModProcLimitSCM       = 2, 
00027   ModProcLimitSM        = 3  
00028 };
00029 
00030 enum ModCSOSelectionMode {
00031   ModSelectAll    = 0,
00032   ModSelectCSOs   = 1,
00033   ModSelectGroups = 2
00034 };
00035 
00037 
00039 class SOCSO_EXPORT CSOModifyProcessor : public CSOProcessor
00040 {
00041 
00042 public:
00043 
00045   CSOModifyProcessor();
00046 
00049   virtual bool process(CSOEvalEventView2DInfos view2DInfos, CSOEvalEventCSOInfos csoInfos);
00050 
00053   virtual bool needsMemoryImage();
00054 
00056   virtual bool isCurrentlyGenerating();
00058   virtual bool isCurrentlyEditing();
00060   virtual bool couldCloseCSO();
00061 
00063   virtual void resetInteractionState();
00065   virtual void triggerSetMouseCursor(SoView2D* view2d, bool shouldSetMouseCursor);
00066 
00067 protected:
00068 
00070   virtual ~CSOModifyProcessor();
00072   virtual void activateAttachments();
00074   virtual void handleNotification(Field* field);
00075 
00076 private:
00077 
00078   /* FIELDS */
00079 
00081   FloatField* _limitValueFld;
00083   EnumField* _limitUnitFld;
00085   EnumField* _editableModeFld;
00087   StringField* _editableCSOsFld;
00088 
00089   /* MEMBER VARIABLES */
00090 
00092   CSOList* _csoList;
00094   Vector3 _currentHitPointWorld;
00096   int _timePoint;
00098   CSO* _mainModificatorCSO;
00100   CSO* _helperModificatorCSO;
00102   bool _isCurrentlyEditing;
00104   std::vector<unsigned int> _selectedIDs;
00106   bool _interactOnlyOnSelectedCSOs;
00107 
00108   /* DATA STRUCTURES */
00109 
00110   typedef std::vector<Vector3> PosVector; 
00111 
00113   struct CSOAndPositions {
00114     CSO* cso;             
00115     PosVector* posVector; 
00116   };
00118   struct CrossingIndices {
00119     int modifyIndex;     
00120     int csoAllIndex;     
00121     Vector3 crossingPoint;  
00122   };
00124   struct EntryExitSegment {
00125     EntryExitSegment() { entryIndex = exitIndex = -1; }
00126     int entryIndex; 
00127     int exitIndex;  
00128   };
00129 
00130   /* METHODS */
00131 
00134   bool _computeCrossingsAndPerformSplit(View2DSliceList* slicelist);
00137   void _collectSegments(const std::vector<Vector3>& clipee, 
00138     const std::vector<Vector3>& clipper,
00139     bool insideOutsideValue,
00140     std::vector<PosVector>& positionSegments,
00141     std::vector<EntryExitSegment>& eeSegments);
00143   bool _segmentsAreCrossing(const Vector3& start0, const Vector3& end0, const Vector3& start1, const Vector3& end1, Vector3& crossingPoint);
00145   float _getScreenDistance(View2DSliceList* slicelist, const Vector3& worldPos1, const Vector3& worldPos2);
00147   void _parseSelection();
00149   bool _isEditable(CSO* cso);
00150 
00151   ML_MODULE_CLASS_HEADER(CSOModifyProcessor);
00152 };
00153 
00155 
00156 
00157 ML_END_NAMESPACE
00158 
00159 
00160 #endif //__CSOModifyProcessor_H
00161