#include "HYDROGUI_ChannelOp.h"
#include "HYDROGUI_DataModel.h"
+#include <HYDROGUI_DataObject.h>
#include "HYDROGUI_ChannelDlg.h"
#include "HYDROGUI_Module.h"
#include "HYDROGUI_Shape.h"
#include <LightApp_Application.h>
#include <LightApp_UpdateFlags.h>
+#include <TopoDS.hxx>
HYDROGUI_ChannelOp::HYDROGUI_ChannelOp( HYDROGUI_Module* theModule,
const bool theIsEdit )
: HYDROGUI_Operation( theModule ),
myIsEdit( theIsEdit ),
- myViewManager( 0 ),
myPreviewPrs( 0 )
{
setName( theIsEdit ? tr( "EDIT_CHANNEL" ) : tr( "CREATE_CHANNEL" ) );
{
HYDROGUI_Operation::startOperation();
- // We start operation in the document
- startDocOperation();
-
HYDROGUI_ChannelDlg* aPanel = ::qobject_cast<HYDROGUI_ChannelDlg*>( inputPanel() );
aPanel->blockSignals( true );
aPanel->reset();
- myEditedObject = getObjectToEdit();
+ myEditedObject.Nullify();
QString aSelectedGuideLine, aSelectedProfile;
QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_CHANNEL_NAME" ) );
- if ( myIsEdit && !myEditedObject.IsNull() )
+ if ( myIsEdit )
{
- anObjectName = myEditedObject->GetName();
+ myEditedObject =
+ Handle(HYDROData_Channel)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
+ if ( !myEditedObject.IsNull() )
+ {
+ anObjectName = myEditedObject->GetName();
- Handle(HYDROData_Polyline3D) aRefGuideLine = myEditedObject->GetGuideLine();
- if ( !aRefGuideLine.IsNull() )
- aSelectedGuideLine = aRefGuideLine->GetName();
+ Handle(HYDROData_Polyline3D) aRefGuideLine = myEditedObject->GetGuideLine();
+ if ( !aRefGuideLine.IsNull() )
+ aSelectedGuideLine = aRefGuideLine->GetName();
- Handle(HYDROData_Profile) aRefProfile = myEditedObject->GetProfile();
- if ( !aRefProfile.IsNull() )
- aSelectedProfile = aRefProfile->GetName();
+ Handle(HYDROData_Profile) aRefProfile = myEditedObject->GetProfile();
+ if ( !aRefProfile.IsNull() )
+ aSelectedProfile = aRefProfile->GetName();
+ }
}
// collect information about existing 3d polylines
- QStringList aGuideLines = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_POLYLINE );
+ QStringList aGuideLines;
+ HYDROData_Iterator aPolylinesIt( doc(), KIND_POLYLINE );
+ for ( ; aPolylinesIt.More(); aPolylinesIt.Next() )
+ {
+ Handle(HYDROData_Polyline3D) aPolyline3d =
+ Handle(HYDROData_Polyline3D)::DownCast( aPolylinesIt.Current() );
+ if( !aPolyline3d.IsNull() )
+ {
+ TopoDS_Shape aShape = aPolyline3d->GetShape3D();
+ if( aShape.ShapeType()==TopAbs_WIRE )
+ {
+ TopoDS_Wire aWire = TopoDS::Wire( aShape );
+ if( !aWire.Closed() )
+ aGuideLines.append( aPolyline3d->GetName() );
+ }
+ }
+ }
// collect information about existing profiles
- QStringList aProfiles = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_PROFILE );
+ QStringList aProfiles = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_PROFILE, true );
aPanel->setObjectName( anObjectName );
aPanel->blockSignals( false );
- onCreatePreview( true );
+ onCreatePreview();
}
-
void HYDROGUI_ChannelOp::abortOperation()
{
erasePreview();
- abortDocOperation();
-
HYDROGUI_Operation::abortOperation();
}
void HYDROGUI_ChannelOp::commitOperation()
{
erasePreview();
-
HYDROGUI_Operation::commitOperation();
}
}
bool HYDROGUI_ChannelOp::processApply( int& theUpdateFlags,
- QString& theErrorMsg )
+ QString& theErrorMsg,
+ QStringList& theBrowseObjectsEntries )
{
HYDROGUI_ChannelDlg* aPanel = ::qobject_cast<HYDROGUI_ChannelDlg*>( inputPanel() );
if ( !aPanel )
return false;
}
- if( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != anObjectName ) )
+ if ( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != anObjectName ) )
{
// check that there are no other objects with the same name in the document
Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), anObjectName );
}
}
+
if ( myEditedObject.IsNull() )
- return false;
+ myEditedObject = createNewObject(); // Create new data model object
myEditedObject->SetName( anObjectName );
- if ( !myIsEdit ) {
- myEditedObject->SetFillingColor( HYDROData_Channel::DefaultFillingColor() );
- myEditedObject->SetBorderColor( HYDROData_Channel::DefaultBorderColor() );
+ if ( !myIsEdit )
+ {
+ myEditedObject->SetFillingColor( getDefaultFillingColor() );
+ myEditedObject->SetBorderColor( getDefaultBorderColor() );
+ }
+
+ QString aGuideLineName = aPanel->getGuideLineName();
+ QString aProfileName = aPanel->getProfileName();
+ if ( aGuideLineName.isEmpty() || aProfileName.isEmpty() )
+ {
+ myEditedObject->RemoveGuideLine();
+ myEditedObject->RemoveProfile();
+ }
+ else
+ {
+ Handle(HYDROData_Polyline3D) aGuideLine = Handle(HYDROData_Polyline3D)::DownCast(
+ HYDROGUI_Tool::FindObjectByName( module(), aGuideLineName, KIND_POLYLINE ) );
+ myEditedObject->SetGuideLine( aGuideLine );
+
+ Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast(
+ HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) );
+ myEditedObject->SetProfile( aProfile );
}
+ if ( myEditedObject->IsMustBeUpdated() )
+ myEditedObject->Update();
+
erasePreview();
if( !myIsEdit )
+ {
module()->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( module() ), myEditedObject, true );
+ QString anEntry = HYDROGUI_DataObject::dataObjectEntry( myEditedObject );
+ theBrowseObjectsEntries.append( anEntry );
+ }
- theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced;
+ module()->setIsToUpdate( myEditedObject );
+
+ theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer;
return true;
}
-Handle(HYDROData_Channel) HYDROGUI_ChannelOp::getObjectToEdit() const
+Handle(HYDROData_Channel) HYDROGUI_ChannelOp::createNewObject() const
+{
+ return Handle(HYDROData_Channel)::DownCast( doc()->CreateObject( KIND_CHANNEL ) );
+}
+
+QColor HYDROGUI_ChannelOp::getDefaultFillingColor() const
{
- return myIsEdit ? Handle(HYDROData_Channel)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ) :
- Handle(HYDROData_Channel)::DownCast( doc()->CreateObject( KIND_CHANNEL ) );
+ return HYDROData_Channel::DefaultFillingColor();
}
-void HYDROGUI_ChannelOp::onCreatePreview( const bool theIsInit )
+QColor HYDROGUI_ChannelOp::getDefaultBorderColor() const
+{
+ return HYDROData_Channel::DefaultBorderColor();
+}
+
+void HYDROGUI_ChannelOp::onCreatePreview()
{
HYDROGUI_ChannelDlg* aPanel = ::qobject_cast<HYDROGUI_ChannelDlg*>( inputPanel() );
- if ( !aPanel || myEditedObject.IsNull() )
+ if ( !aPanel )
return;
QString aGuideLineName = aPanel->getGuideLineName();
QString aProfileName = aPanel->getProfileName();
if ( aGuideLineName.isEmpty() || aProfileName.isEmpty() )
{
- if ( !theIsInit )
- {
- myEditedObject->RemoveGuideLine();
- myEditedObject->RemoveProfile();
- myEditedObject->Update();
- }
-
erasePreview();
return;
}
- // Update channel data
- if ( !theIsInit )
+ LightApp_Application* anApp = module()->getApp();
+
+ if ( !getPreviewManager() )
{
- Handle(HYDROData_Polyline3D) aGuideLine = Handle(HYDROData_Polyline3D)::DownCast(
- HYDROGUI_Tool::FindObjectByName( module(), aGuideLineName, KIND_POLYLINE ) );
- myEditedObject->SetGuideLine( aGuideLine );
-
- Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast(
- HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) );
- myEditedObject->SetProfile( aProfile );
-
- if ( myEditedObject->IsMustBeUpdated() )
- myEditedObject->Update();
+ setPreviewManager( ::qobject_cast<OCCViewer_ViewManager*>(
+ anApp->getViewManager( OCCViewer_Viewer::Type(), true ) ) );
}
- LightApp_Application* anApp = module()->getApp();
- if ( !myViewManager )
- myViewManager = ::qobject_cast<OCCViewer_ViewManager*>(
- anApp->getViewManager( OCCViewer_Viewer::Type(), true ) );
-
- if ( myViewManager && !myPreviewPrs )
+ OCCViewer_ViewManager* aViewManager = getPreviewManager();
+ if ( aViewManager && !myPreviewPrs )
{
- if ( OCCViewer_Viewer* aViewer = myViewManager->getOCCViewer() )
+ if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() )
{
Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
if ( !aCtx.IsNull() )
- myPreviewPrs = new HYDROGUI_Shape( aCtx, myEditedObject );
+ {
+ myPreviewPrs = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() );
+
+ QColor aFillingColor = getDefaultFillingColor();
+ QColor aBorderColor = getDefaultBorderColor();
+ if ( !myEditedObject.IsNull() )
+ {
+ aFillingColor = myEditedObject->GetFillingColor();
+ aBorderColor = myEditedObject->GetBorderColor();
+ }
+
+ myPreviewPrs->setFillingColor( aFillingColor, false, false );
+ myPreviewPrs->setBorderColor( aBorderColor, false, false );
+ }
}
}
- if ( !myViewManager || !myPreviewPrs )
+ if ( !aViewManager || !myPreviewPrs )
return;
- myPreviewPrs->update();
+ Handle(HYDROData_Polyline3D) aGuideLine = Handle(HYDROData_Polyline3D)::DownCast(
+ HYDROGUI_Tool::FindObjectByName( module(), aGuideLineName, KIND_POLYLINE ) );
+
+ Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast(
+ HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) );
+
+ HYDROData_Channel::PrsDefinition aPrsDef;
+ if ( !HYDROData_Channel::CreatePresentations( aGuideLine, aProfile, aPrsDef ) )
+ {
+ erasePreview();
+ return;
+ }
+
+ myPreviewPrs->setShape( aPrsDef.myPrs2D );
}
void HYDROGUI_ChannelOp::erasePreview()