18 #include <QApplication>
19 #include <QMainWindow>
20 #include <QProgressDialog>
21 #include <QtConcurrentRun>
25 #include <mesh/corkMesh.h>
28 #if defined(CV_WINDOWS)
35 qCork::qCork(QObject* parent )
40 QList<QAction*> qCork::getActions() {
56 m_action->setEnabled(selectedEntities.size() == 2 &&
63 if (!in || !in->getAssociatedCloud()) {
65 app->dispToConsole(
"[Cork] Invalid input mesh!",
74 unsigned triCount = in->size();
75 unsigned vertCount = vertices ? vertices->
size() : 0;
77 std::vector<CorkMesh::Tri>& outTris = out.getTris();
78 std::vector<CorkVertex>& outVerts = out.getVerts();
80 outVerts.resize(vertCount);
81 outTris.resize(triCount);
82 }
catch (
const std::bad_alloc&) {
84 app->dispToConsole(
"[Cork] Not enough memory!",
89 if (outVerts.empty() || outTris.empty()) {
91 app->dispToConsole(QString(
"[Cork] Input mesh '%1' is empty?!")
99 for (
unsigned i = 0; i < triCount; i++) {
101 in->getTriangleVertIndexes(i);
102 CorkTriangle corkTri;
106 outTris[i].data = corkTri;
108 outTris[i].a = tsi->
i1;
109 outTris[i].b = tsi->
i2;
110 outTris[i].c = tsi->
i3;
116 for (
unsigned i = 0; i < vertCount; i++) {
118 outVerts[i].pos.
x =
static_cast<double>(P->
x);
119 outVerts[i].pos.y =
static_cast<double>(P->
y);
120 outVerts[i].pos.z =
static_cast<double>(P->
z);
128 const std::vector<CorkMesh::Tri>& inTris = in.getTris();
129 const std::vector<CorkVertex>& inVerts = in.getVerts();
131 if (inTris.empty() || inVerts.empty()) {
133 app->dispToConsole(
"[Cork] Output mesh is empty?!",
138 unsigned triCount =
static_cast<unsigned>(inTris.size());
139 unsigned vertCount =
static_cast<unsigned>(inVerts.size());
142 if (!vertices->
reserve(vertCount)) {
144 app->dispToConsole(
"[Cork] Not enough memory!",
152 if (!mesh->
reserve(triCount)) {
154 app->dispToConsole(
"[Cork] Not enough memory!",
162 for (
unsigned i = 0; i < vertCount; i++) {
163 const CorkVertex& P = inVerts[i];
173 for (
unsigned i = 0; i < triCount; i++) {
174 const CorkMesh::Tri& tri = inTris[i];
215 QString(
"[Cork] Mesh '%1' is self-intersecting! "
216 "Result may be jeopardized!")
223 QString(
"[Cork] Mesh '%1' is not closed! Result "
224 "may be jeopardized!")
232 QString(
"[Cork] Mesh '%1' is self-intersecting! "
233 "Result may be jeopardized!")
240 QString(
"[Cork] Mesh '%1' is not closed! Result "
241 "may be jeopardized!")
270 "Unhandled operation?!",
272 WRN_CONSOLE_MESSAGE);
278 }
catch (
const std::exception& e) {
281 QString(
"Exception caught: %1").arg(e.what()),
294 size_t selNum = selectedEntities.size();
295 if (selNum != 2 || !selectedEntities[0]->isKindOf(
CV_TYPES::MESH) ||
303 ccMesh* meshA =
static_cast<ccMesh*
>(selectedEntities[0]);
304 ccMesh* meshB =
static_cast<ccMesh*
>(selectedEntities[1]);
309 if (!cDlg.exec())
return;
321 QProgressDialog pDlg(
"Operation in progress", QString(), 0, 0,
323 pDlg.setWindowTitle(
"Cork");
325 QApplication::processEvents();
337 while (!future.isFinished()) {
338 #if defined(CV_WINDOWS)
344 pDlg.setValue(pDlg.value() + 1);
345 QApplication::processEvents();
353 QApplication::processEvents();
355 if (!future.result()) {
359 ?
"Computation failed!"
360 :
"Computation failed! (check console)",
395 result->setName(QString(
"(%1).%2.(%3)")
401 bool hasNormals =
false;
403 hasNormals =
result->computePerTriangleNormals();
405 hasNormals =
result->computePerVertexNormals();
float PointCoordinateType
Type of the coordinates of a (N-D) point.
CSG_OPERATION
Supported CSG operations.
CSG_OPERATION getSelectedOperation() const
Returns the selected operation.
void setNames(QString A, QString B)
Set meshes names.
bool isSwapped() const
Returns whether mesh order has been swappped or not.
virtual QString getName() const override
Returns (short) name (for menu entry, etc.)
virtual QString getDescription() const override
Returns long name/description (for tooltip, etc.)
virtual QIcon getIcon() const override
Returns icon.
virtual void setVisible(bool state)
Sets entity visibility.
void showNormals(bool state) override
Sets normals visibility.
A 3D cloud interface with associated features (color, normals, octree, etc.)
virtual bool addChild(ccHObject *child, int dependencyFlags=DP_PARENT_OF_OTHER, int insertIndex=-1)
Adds a child.
std::vector< ccHObject * > Container
Standard instances container (for children, etc.)
bool normalsShown() const override
Returns whether normals are shown or not.
bool reserve(std::size_t n)
Reserves the memory to store the vertex indexes (3 per triangle)
void addTriangle(unsigned i1, unsigned i2, unsigned i3)
Adds a triangle to the mesh.
bool hasNormals() const override
Returns whether normals are enabled or not.
bool hasTriNormals() const override
Returns whether the mesh has per-triangle normals.
virtual QString getName() const
Returns object name.
virtual void setEnabled(bool state)
Sets the "enabled" property.
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
bool reserve(unsigned numberOfPoints) override
Reserves memory for all the active features.
Standard ECV plugin interface.
virtual void onNewSelection(const ccHObject::Container &selectedEntities)
ecvMainAppInterface * m_app
Main application interface.
virtual unsigned size() const =0
Returns the number of points.
virtual const CCVector3 * getPoint(unsigned index) const =0
Returns the ith point.
void addPoint(const CCVector3 &P)
Adds a 3D point to the database.
Main application interface (for plugins)
virtual QMainWindow * getMainWindow()=0
Returns main window.
virtual const ccHObject::Container & getSelectedEntities() const =0
Returns currently selected entities ("read only")
virtual void addToDB(ccHObject *obj, bool updateZoom=false, bool autoExpandDBTree=true, bool checkDimensions=false, bool autoRedraw=true)=0
virtual void dispToConsole(QString message, ConsoleMessageLevel level=STD_CONSOLE_MESSAGE)=0
QAction * m_action
Associated action.
void doAction()
Starts main action.
void Sleep(int milliseconds)
void swap(cloudViewer::core::SmallVectorImpl< T > &LHS, cloudViewer::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
static BoolOpParameters s_params
bool doPerformBooleanOp()
bool ToCorkMesh(const ccMesh *in, CorkMesh &out, ecvMainAppInterface *app=0)
ccMesh * FromCorkMesh(const CorkMesh &in, ecvMainAppInterface *app=0)
Boolean operation parameters (for concurrent run)
ccCorkDlg::CSG_OPERATION operation
ecvMainAppInterface * app
Triangle described by the indexes of its 3 vertices.