Implement data transfering

This commit is contained in:
skv 2014-12-10 11:04:29 +03:00
parent 0f99c6b595
commit bb28e1dca6
8 changed files with 454 additions and 7 deletions

View File

@ -7198,5 +7198,21 @@ Do you want to create new material?</translation>
<source>GEOM_TRANSFER_DATA_INFO</source> <source>GEOM_TRANSFER_DATA_INFO</source>
<translation>Transfer Data: Information</translation> <translation>Transfer Data: Information</translation>
</message> </message>
<message>
<source>GEOM_TRANSFER_DATA_NOT_COPIED</source>
<translation>There is nothing to be copied.</translation>
</message>
<message>
<source>GEOM_TRANSFER_DATA_COPIED</source>
<translation>The following data is copied:</translation>
</message>
<message>
<source>GEOM_TRANSFER_DATA_NAMES</source>
<translation>Names: %1 of %2</translation>
</message>
<message>
<source>GEOM_TRANSFER_DATA_MATERIALS</source>
<translation>Materials: %1 of %2</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -197,6 +197,7 @@ SET(GEOMImpl_SOURCES
GEOMImpl_IFieldOperations.cxx GEOMImpl_IFieldOperations.cxx
GEOMImpl_IBaseIEOperations.cxx GEOMImpl_IBaseIEOperations.cxx
GEOMImpl_IPolyline2D.cxx GEOMImpl_IPolyline2D.cxx
GEOMImpl_ITransferData.cxx
GEOMImpl_Gen.cxx GEOMImpl_Gen.cxx
GEOMImpl_PointDriver.cxx GEOMImpl_PointDriver.cxx
GEOMImpl_VectorDriver.cxx GEOMImpl_VectorDriver.cxx

View File

@ -22,18 +22,36 @@
#include "GEOMImpl_CopyDriver.hxx" #include "GEOMImpl_CopyDriver.hxx"
#include "GEOMImpl_ICopy.hxx" #include "GEOMImpl_ICopy.hxx"
#include "GEOMImpl_ITransferData.hxx"
#include "GEOMImpl_Types.hxx" #include "GEOMImpl_Types.hxx"
#include "GEOM_Function.hxx" #include "GEOM_Function.hxx"
#include "GEOM_Object.hxx" #include "GEOM_Object.hxx"
#include "GEOMAlgo_GetInPlace.hxx"
#include <Bnd_Box.hxx>
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <BRepBndLib.hxx>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <Precision.hxx>
#include <TopoDS.hxx> #include <TopoDS.hxx>
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx> #include <TopoDS_Vertex.hxx>
#include <TopAbs.hxx> #include <TopAbs.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TNaming_CopyShape.hxx> #include <TNaming_CopyShape.hxx>
#include <TColStd_IndexedDataMapOfTransientTransient.hxx> #include <TColStd_IndexedDataMapOfTransientTransient.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_MapIteratorOfMapOfShape.hxx>
#define NB_DATUM 2
#define DATUM_NAME_INDEX 1
#define DATUM_MATERIAL_INDEX 2
//======================================================================= //=======================================================================
//function : GetID //function : GetID
@ -65,6 +83,10 @@ Standard_Integer GEOMImpl_CopyDriver::Execute(TFunction_Logbook& log) const
Standard_Integer aType = aFunction->GetType(); Standard_Integer aType = aFunction->GetType();
if (aType == TRANSFER_DATA) {
return transferData(log);
}
GEOMImpl_ICopy aCI (aFunction); GEOMImpl_ICopy aCI (aFunction);
TopoDS_Shape aCopy; TopoDS_Shape aCopy;
@ -129,6 +151,189 @@ GetCreationInformation(std::string& theOperationName,
return true; return true;
} }
//================================================================================
/*!
* \brief Performs Transfer Data operation.
*/
//================================================================================
Standard_Integer GEOMImpl_CopyDriver::transferData(TFunction_Logbook& log) const
{
Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
GEOMImpl_ITransferData aTD (aFunction);
Handle(GEOM_Function) aRef1 = aTD.GetRef1();
Handle(GEOM_Function) aRef2 = aTD.GetRef2();
if (aRef1.IsNull() || aRef2.IsNull()) {
return 0;
}
TopoDS_Shape aShape1 = aRef1->GetValue();
TopoDS_Shape aShape2 = aRef2->GetValue();
const int aFindMethod = aTD.GetFindMethod();
TopTools_IndexedDataMapOfShapeListOfShape aMapSoDest;
Standard_Integer i;
TopTools_IndexedMapOfShape anIndices1;
Standard_Integer aNbShapes;
TopExp::MapShapes(aShape1, anIndices1);
aNbShapes = anIndices1.Extent();
switch (aFindMethod) {
case TD_GET_IN_PLACE:
{
// Compute confusion tolerance.
Standard_Real aTolConf = Precision::Confusion();
for (i = 0; i < 2; ++i) {
TopExp_Explorer anExp(i == 0 ? aShape1 : aShape2, TopAbs_VERTEX);
for (; anExp.More(); anExp.Next()) {
const TopoDS_Vertex aVtx = TopoDS::Vertex(anExp.Current());
const Standard_Real aTolVtx = BRep_Tool::Tolerance(aVtx);
if (aTolVtx > aTolConf) {
aTolConf = aTolVtx;
}
}
}
// Compute mass tolerance.
Bnd_Box aBoundingBox;
Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
Standard_Real aMassTol;
BRepBndLib::Add(aShape1, aBoundingBox);
BRepBndLib::Add(aShape2, aBoundingBox);
aBoundingBox.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
aMassTol = Max(aXmax - aXmin, aYmax - aYmin);
aMassTol = Max(aMassTol, aZmax - aZmin);
aMassTol *= aTolConf;
// Searching for the sub-shapes inside the ShapeWhere shape
GEOMAlgo_GetInPlace aGIP;
aGIP.SetTolerance(aTolConf);
aGIP.SetTolMass(aMassTol);
aGIP.SetTolCG(aTolConf);
aGIP.SetArgument(aShape1);
aGIP.SetShapeWhere(aShape2);
aGIP.Perform();
int iErr = aGIP.ErrorStatus();
if (iErr) {
return 0;
}
const GEOMAlgo_DataMapOfShapeMapOfShape &aShapesIn = aGIP.ShapesIn();
const GEOMAlgo_DataMapOfShapeMapOfShape &aShapesOn = aGIP.ShapesOn();
Standard_Integer j;
for (j = 1; j <= aNbShapes; ++j) {
const TopoDS_Shape &aSource = anIndices1.FindKey(j);
TopTools_ListOfShape aListShapes2;
TopTools_MapOfShape aMapShapes2;
for (i = 0; i < 2; ++i) {
const GEOMAlgo_DataMapOfShapeMapOfShape &aShapes2 =
i == 0 ? aShapesIn : aShapesOn;
if (aShapes2.IsBound(aSource)) {
const TopTools_MapOfShape &aMapShapesDest =
aShapes2.Find(aSource);
TopTools_MapIteratorOfMapOfShape aMapIter(aMapShapesDest);
for (; aMapIter.More(); aMapIter.Next()) {
const TopoDS_Shape &aShapeDest = aMapIter.Key();
if (aMapShapes2.Add(aShapeDest)) {
aListShapes2.Append(aShapeDest);
}
}
}
}
if (!aListShapes2.IsEmpty()) {
aMapSoDest.Add(aSource, aListShapes2);
}
}
}
break;
case TD_GET_IN_PLACE_OLD:
case TD_GET_IN_PLACE_BY_HISTORY:
default:
return 0;
}
// Perform copying names.
Handle(TColStd_HArray1OfExtendedString) aDatumName =
new TColStd_HArray1OfExtendedString(1, NB_DATUM);
Handle(TColStd_HArray1OfInteger) aDatumMaxVal =
new TColStd_HArray1OfInteger(1, NB_DATUM, 0);
Handle(TColStd_HArray1OfInteger) aDatumVal =
new TColStd_HArray1OfInteger(1, NB_DATUM, 0);
GEOMImpl_ITransferData aTD1(aRef1);
GEOMImpl_ITransferData aTD2(aRef2);
aDatumName->SetValue(DATUM_NAME_INDEX, "GEOM_TRANSFER_DATA_NAMES");
aDatumName->SetValue(DATUM_MATERIAL_INDEX, "GEOM_TRANSFER_DATA_MATERIALS");
for (i = 1; i <= aNbShapes; ++i) {
const TopoDS_Shape &aSource = anIndices1.FindKey(i);
TCollection_AsciiString aName = aTD1.GetName(aSource);
TCollection_AsciiString aMaterial = aTD1.GetMaterial(aSource);
// Transfer name
if (!aName.IsEmpty()) {
aDatumMaxVal->ChangeValue(DATUM_NAME_INDEX)++;
if (aMapSoDest.Contains(aSource)) {
aDatumVal->ChangeValue(DATUM_NAME_INDEX)++;
// Copy name to the list of subshapes of the second shape.
const TopTools_ListOfShape &aListDest =
aMapSoDest.FindFromKey(aSource);
TopTools_ListIteratorOfListOfShape anIt(aListDest);
for (; anIt.More(); anIt.Next()) {
const TopoDS_Shape &aShapeDest = anIt.Value();
aTD2.SetName(aShapeDest, aName);
}
}
}
// Transfer Material
if (!aMaterial.IsEmpty()) {
aDatumMaxVal->ChangeValue(DATUM_MATERIAL_INDEX)++;
if (aMapSoDest.Contains(aSource)) {
aDatumVal->ChangeValue(DATUM_MATERIAL_INDEX)++;
// Copy material to the list of subshapes of the second shape.
const TopTools_ListOfShape &aListDest =
aMapSoDest.FindFromKey(aSource);
TopTools_ListIteratorOfListOfShape anIt(aListDest);
for (; anIt.More(); anIt.Next()) {
const TopoDS_Shape &aShapeDest = anIt.Value();
aTD2.SetMaterial(aShapeDest, aMaterial);
}
}
}
}
// Store results.
aTD.SetDatumName(aDatumName);
aTD.SetDatumMaxVal(aDatumMaxVal);
aTD.SetDatumVal(aDatumVal);
return 1;
}
IMPLEMENT_STANDARD_HANDLE (GEOMImpl_CopyDriver,GEOM_BaseDriver); IMPLEMENT_STANDARD_HANDLE (GEOMImpl_CopyDriver,GEOM_BaseDriver);
IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_CopyDriver,GEOM_BaseDriver); IMPLEMENT_STANDARD_RTTIEXT (GEOMImpl_CopyDriver,GEOM_BaseDriver);

View File

@ -82,6 +82,11 @@ Standard_EXPORT ~GEOMImpl_CopyDriver() {};
std::vector<GEOM_Param>& params); std::vector<GEOM_Param>& params);
DEFINE_STANDARD_RTTI( GEOMImpl_CopyDriver ) DEFINE_STANDARD_RTTI( GEOMImpl_CopyDriver )
private:
Standard_Integer transferData(TFunction_Logbook& log) const;
}; };
#endif #endif

View File

@ -399,6 +399,29 @@ bool GEOMImpl_IInsertOperations::TransferData
return false; return false;
} }
// Fill result list of data.
theResult.clear();
Handle(TColStd_HArray1OfExtendedString) aDatumName = aTD.GetDatumName();
Handle(TColStd_HArray1OfInteger) aDatumMaxVal = aTD.GetDatumMaxVal();
Handle(TColStd_HArray1OfInteger) aDatumVal = aTD.GetDatumVal();
if (!aDatumName.IsNull() && !aDatumMaxVal.IsNull() && !aDatumVal.IsNull()) {
Standard_Integer i;
Standard_Integer aNbDatum = aDatumName->Length();
for (i = 1; i <= aNbDatum; ++i) {
if (aDatumMaxVal->Value(i) > 0) {
TransferDatum aDatum;
aDatum.myName = TCollection_AsciiString(aDatumName->Value(i));
aDatum.myNumber = aDatumVal->Value(i);
aDatum.myMaxNumber = aDatumMaxVal->Value(i);
theResult.push_back(aDatum);
}
}
}
//Make a Python command //Make a Python command
GEOM::TPythonDump pd (aFunction); GEOM::TPythonDump pd (aFunction);
pd << "geompy.TransferData(" << theObjectFrom << ", " << theObjectTo; pd << "geompy.TransferData(" << theObjectFrom << ", " << theObjectTo;

View File

@ -0,0 +1,137 @@
// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
//NOTE: This is an intreface to a function for the Transfer Data functionality.
//
#include "GEOMImpl_ITransferData.hxx"
#include <TDataStd_Comment.hxx>
#include <TDataStd_Name.hxx>
#include <TDF_ChildIDIterator.hxx>
#include <TNaming_Builder.hxx>
#include <TNaming_NamedShape.hxx>
//=============================================================================
/*!
* SetName
*/
//=============================================================================
void GEOMImpl_ITransferData::SetStringData
(const TopoDS_Shape &theSubShape,
const TCollection_AsciiString &theData,
const Standard_Boolean IsName)
{
TDF_Label aLabel;
TDF_ChildIDIterator anIt
(_func->GetNamingEntry(), TDataStd_Name::GetID(), Standard_True);
for (; anIt.More(); anIt.Next()) {
Handle(TDataStd_Name) aNameAttr =
Handle(TDataStd_Name)::DownCast(anIt.Value());
if (aNameAttr.IsNull()) {
continue;
}
TDF_Label aLab = aNameAttr->Label();
Handle(TNaming_NamedShape) aShAttr;
if (aLab.FindAttribute(TNaming_NamedShape::GetID(), aShAttr) &&
aShAttr->Get().IsEqual(theSubShape)) {
aLabel = aLab;
break;
}
}
if (aLabel.IsNull()) {
TDF_TagSource aTag;
aLabel = aTag.NewChild(_func->GetNamingEntry());
TNaming_Builder aTnBuild (aLabel);
aTnBuild.Generated(theSubShape);
}
// set a name or a material
TCollection_ExtendedString aDataExt(theData);
if (IsName) {
TDataStd_Name::Set(aLabel, aDataExt);
} else {
TDataStd_Comment::Set(aLabel, aDataExt);
}
}
//=============================================================================
/*!
* GetStringData
*/
//=============================================================================
TCollection_AsciiString GEOMImpl_ITransferData::GetStringData
(const TopoDS_Shape &theSubShape,
const Standard_Boolean IsName)
{
// check all named shapes using iterator
TCollection_AsciiString aResult;
TDF_ChildIDIterator anIt
(_func->GetNamingEntry(), TNaming_NamedShape::GetID(), Standard_True);
for (; anIt.More(); anIt.Next()) {
Handle(TNaming_NamedShape) aShAttr =
Handle(TNaming_NamedShape)::DownCast(anIt.Value());
if (aShAttr.IsNull()) {
continue;
}
if (aShAttr->Get().IsEqual(theSubShape)) {
TDF_Label aLabel = aShAttr->Label();
Standard_Boolean isFound = Standard_False;
if (IsName) {
Handle(TDataStd_Name) aString;
if(aLabel.FindAttribute(TDataStd_Name::GetID(), aString)) {
aResult = TCollection_AsciiString(aString->Get());
isFound = Standard_True;
}
} else {
Handle(TDataStd_Comment) aString;
if(aLabel.FindAttribute(TDataStd_Comment::GetID(), aString)) {
aResult = TCollection_AsciiString(aString->Get());
isFound = Standard_True;
}
}
if (isFound) {
break;
}
}
}
return aResult;
}

View File

@ -22,11 +22,24 @@
//NOTE: This is an intreface to a function for the Transfer Data functionality. //NOTE: This is an intreface to a function for the Transfer Data functionality.
// //
#ifndef _GEOMImpl_ITransferData_HXX_
#define _GEOMImpl_ITransferData_HXX_
#include "GEOM_GEOMImpl.hxx"
#include "GEOM_Function.hxx" #include "GEOM_Function.hxx"
#define TD_ARG_REF1 1 #include <TColStd_HArray1OfInteger.hxx>
#define TD_ARG_REF2 2
#define TD_ARG_METHOD 3
#define TD_ARG_REF1 1
#define TD_ARG_REF2 2
#define TD_ARG_METHOD 3
#define TD_ARG_DATUM_NAME 4
#define TD_ARG_DATUM_MAX_VALUE 5
#define TD_ARG_DATUM_VALUE 6
class GEOMImpl_ITransferData class GEOMImpl_ITransferData
{ {
@ -50,7 +63,52 @@ class GEOMImpl_ITransferData
int GetFindMethod() { return _func->GetInteger(TD_ARG_METHOD); } int GetFindMethod() { return _func->GetInteger(TD_ARG_METHOD); }
void SetDatumName(const Handle(TColStd_HArray1OfExtendedString) &theDatumName)
{ _func->SetStringArray(TD_ARG_DATUM_NAME, theDatumName); }
Handle(TColStd_HArray1OfExtendedString) GetDatumName()
{ return _func->GetStringArray(TD_ARG_DATUM_NAME); }
void SetDatumMaxVal(const Handle(TColStd_HArray1OfInteger) &theDatumMaxVal)
{ _func->SetIntegerArray(TD_ARG_DATUM_MAX_VALUE, theDatumMaxVal); }
Handle(TColStd_HArray1OfInteger) GetDatumMaxVal()
{ return _func->GetIntegerArray(TD_ARG_DATUM_MAX_VALUE); }
void SetDatumVal(const Handle(TColStd_HArray1OfInteger) &theDatumVal)
{ _func->SetIntegerArray(TD_ARG_DATUM_VALUE, theDatumVal); }
Handle(TColStd_HArray1OfInteger) GetDatumVal()
{ return _func->GetIntegerArray(TD_ARG_DATUM_VALUE); }
GEOMIMPL_EXPORT void SetName(const TopoDS_Shape &theSubShape,
const TCollection_AsciiString &theName)
{ SetStringData(theSubShape, theName, Standard_True); }
GEOMIMPL_EXPORT TCollection_AsciiString GetName
(const TopoDS_Shape &theSubShape)
{ return GetStringData(theSubShape, Standard_True); }
GEOMIMPL_EXPORT void SetMaterial(const TopoDS_Shape &theSubShape,
const TCollection_AsciiString &theName)
{ SetStringData(theSubShape, theName, Standard_False); }
GEOMIMPL_EXPORT TCollection_AsciiString GetMaterial
(const TopoDS_Shape &theSubShape)
{ return GetStringData(theSubShape, Standard_False); }
private:
TCollection_AsciiString GetStringData(const TopoDS_Shape &theSubShape,
const Standard_Boolean IsName);
void SetStringData(const TopoDS_Shape &theSubShape,
const TCollection_AsciiString &theData,
const Standard_Boolean IsName);
private: private:
Handle(GEOM_Function) _func; Handle(GEOM_Function) _func;
}; };
#endif

View File

@ -143,7 +143,7 @@ void OperationGUI_TransferDataDlg::ClickOnOk()
//================================================================================= //=================================================================================
bool OperationGUI_TransferDataDlg::ClickOnApply() bool OperationGUI_TransferDataDlg::ClickOnApply()
{ {
if (!onAccept()) if (!onAccept(false))
return false; return false;
// activate first line edit // activate first line edit
myGroup->PushButton1->click(); myGroup->PushButton1->click();
@ -157,7 +157,7 @@ bool OperationGUI_TransferDataDlg::ClickOnApply()
void OperationGUI_TransferDataDlg::SelectionIntoArgument() void OperationGUI_TransferDataDlg::SelectionIntoArgument()
{ {
GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_SHAPE); GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_SHAPE);
if (aSelectedObject) { if (aSelectedObject) {
myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject.get())); myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject.get()));
@ -305,8 +305,8 @@ bool OperationGUI_TransferDataDlg::execute (ObjectList& objects)
if (aNbTypes == 0) { if (aNbTypes == 0) {
aMsg = tr("GEOM_TRANSFER_DATA_NOT_COPIED"); aMsg = tr("GEOM_TRANSFER_DATA_NOT_COPIED");
} else { } else {
aMsg = tr("GEOM_TRANSFER_DATA_COPIED\n"); aMsg = tr("GEOM_TRANSFER_DATA_COPIED");
aMsg += "\n";
int i; int i;
for (i = 0; i < aNbTypes; i++ ) { for (i = 0; i < aNbTypes; i++ ) {
@ -323,6 +323,8 @@ bool OperationGUI_TransferDataDlg::execute (ObjectList& objects)
SUIT_MessageBox::information SUIT_MessageBox::information
(SUIT_Session::session()->activeApplication()->desktop(), (SUIT_Session::session()->activeApplication()->desktop(),
tr("GEOM_TRANSFER_DATA_INFO"), aMsg, tr("BUT_OK")); tr("GEOM_TRANSFER_DATA_INFO"), aMsg, tr("BUT_OK"));
objects.push_back(myObject2.copy());
} }
return isOK; return isOK;