目录
一、缘起
主要还是项目功能需求,方便用户操作使用,
同时主要就是记录一下,谨防遗忘。
前期准备工作及相关环境可参考以下:
基于QT CC 点云二开及魔改记录_cc点云显示-CSDN博客
至此,CC相关的应用功能基本上探索的差不多了,后期就是核心库中的东西或者是其他点云核心库及算法方面的探索了。
二、功能准备
1.2D标签功能,通过之前的一些列操作,已经对CC的界面层相关应用功能已经了有了不少深入的了解所以对于CC原本就具有的2D标签功能移植已经不是什么问题剩余就是标签内容的修改定制问题。
2.ROI选定问题,CC是不具备这功能的,但是CC有对3D点云模型的 剖面截取、裁剪盒这些功能,正好可以拿来作用一番。
三、裁剪盒的基本分析
void MainWindow::activateClippingBoxMode(){
ccClippingBoxTool *m_clipTool;
m_clipTool->linkWith(win);
if (m_clipTool->addAssociatedEntity(entity))
if (m_clipTool->getNumberOfAssociatedEntity() == 0)//{return m_clipBox ? m_clipBox->getContainer().getChildrenNumber() : 0;}
{
m_clipTool->close();
return;
}
if (m_clipTool->start())
}
//ccClippingBoxTool.cpp
class ccClippingBoxTool{
exportButton//剖面切片导出按钮
exportMultButton//多层剖面切片导出按钮
editBoxToolButton//边界盒编辑信息按钮
ccClipBox* m_clipBox;
connect(exportButton,&QToolButton::clicked,this, &ccClippingBoxTool::exportSlice);
connect(editBoxToolButton,&QToolButton::clicked,this, &ccClippingBoxTool::editBox);
void ccClippingBoxTool::editBox(){
ccBBox box;
ccGLMatrix transformation;
m_clipBox->get(box, transformation);
ccBoundingBoxEditorDlg bbeDlg(this);
bbeDlg.setBaseBBox(box, false);
bbeDlg.showInclusionWarning(false);
bbeDlg.showBoxAxes(true);
bbeDlg.setBoxAxes( transformation.getColumnAsVec3D(0),
transformation.getColumnAsVec3D(1),
transformation.getColumnAsVec3D(2) );
if (!bbeDlg.exec())
return;
box = bbeDlg.getBox();
}
}
//ccBoundingBoxEditorDlg=》ccBoundingBoxEditorDlg.cpp{
class ccBoundingBoxEditorDlg{
pointTypeComboBox widthComboBox
/*坐标信息
X: xDoubleSpinBox dxDoubleSpinBox
Y: yDoubleSpinBox dyDoubleSpinBox
Z:zDoubleSpinBox dzDoubleSpinBox
*/
fromClipboardPushButton toClipboardPushButton
//手动修改裁剪盒坐标信息相关界面上的事件
connect(xDoubleSpinBox,static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),this,&ccBoundingBoxEditorDlg::updateCurrentBBox);
connect(yDoubleSpinBox,static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),this,&ccBoundingBoxEditorDlg::updateCurrentBBox);
connect(zDoubleSpinBox,static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),this,&ccBoundingBoxEditorDlg::updateCurrentBBox);
connect(dxDoubleSpinBox,static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),this,&ccBoundingBoxEditorDlg::updateXWidth);
connect(dyDoubleSpinBox,static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),this,&ccBoundingBoxEditorDlg::updateYWidth);
connect(dzDoubleSpinBox,static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),this,&ccBoundingBoxEditorDlg::updateZWidth);
updateCurrentBBox(){
}
connect(pointTypeComboBox,static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),this,&ccBoundingBoxEditorDlg::reflectChanges);
reflectChanges(){
}
}
四、裁剪盒对象实际使用代码
{
ccClipBox* m_clipBox;
m_clipBox = new ccClipBox(QString(), static_cast<unsigned>(ReservedIDs::CLIPPING_BOX));
m_clipBox->setVisible(true);
m_clipBox->setEnabled(true);
m_clipBox->setSelected(showInteractorsToolButton->isChecked());
connect(m_clipBox, &ccClipBox::boxModified, this, &ccClippingBoxTool::onBoxModified);//信号槽函数修改通知
m_associatedWin->addToOwnDB(m_clipBox);
if (!m_clipBox->addAssociatedEntity(entity))
{
return false;
}
//set proper "steps" value for slice thickness editors
{
CCVector3 diag = m_clipBox->getBox().getDiagVec();
thickXDoubleSpinBox->setSingleStep(diag.x / 100.0);
thickYDoubleSpinBox->setSingleStep(diag.y / 100.0);
thickZDoubleSpinBox->setSingleStep(diag.z / 100.0);
}
m_clipBox->reset();
m_associatedWin->setUnclosable(true);
m_associatedWin->redraw();
}
实际使用上的的代码 如上 只需面向CV(CTRL + C,CTRL + V ) 即可,去除不要的,结合自己实际情况改下即可。
五、显示渲染相关代码分析
//CC的窗体渲染部分,通过opengl实现
class ccGLWindow : public ccGLWindowParent, public ccGenericGLDisplay{
//QT 的 Opengl功能调用
using ccQOpenGLFunctions = QOpenGLFunctions_2_1;
inline ccQOpenGLFunctions* functions() const { return context() ? context()->versionFunctions<ccQOpenGLFunctions>() : nullptr; }
//窗口显示相关参数来源
const ccGui::ParamStruct& ccGLWindow::getDisplayParameters() const
{
return m_overridenDisplayParametersEnabled ? m_overridenDisplayParameters : ccGui::Parameters();
}
//绘制 2D ,背景 , 没有光照,
void ccGLWindow::drawBackground(CC_DRAW_CONTEXT& CONTEXT, RenderingParams& renderingParams)
//绘制可以点击的条目
void ccGLWindow::drawClickableItems(int xStart0, int& yStart){
}
//文本渲染
renderText{
}
void ccGLWindow::displayText{
renderText()
}
}
//CC核心库里面的内部2D标签对象
//lib/qcc_db/cc2DLabel.cpp
class QCC_DB_LIB_API cc2DLabel : public ccHObject, public ccInteractor{
//核心标签绘制方法
void cc2DLabel::drawMeOnly2D(CC_DRAW_CONTEXT& context){
.....
.....
//默认是2D 点坐标标签的,通过这个宏定义也可以是内容标签
#define DRAW_CONTENT_AS_TAB
#ifdef DRAW_CONTENT_AS_TAB
//draw contents as an array
Tab tab(4);
int rowHeight = 0;
#else
//simply display the content as text
QStringList body;
#endif
.......
}
}
//-------CC核心库内部的两种点云结构-------------
class QCC_DB_LIB_API ccPointCloud : public CCLib::PointCloudTpl<ccGenericPointCloud, QString>{}
class QCC_DB_LIB_API ccGenericPointCloud : public ccShiftedObject, public CCLib::GenericIndexedCloudPersist{}
有了上面CC渲染相关分析后,对于后面改造2D标签简单了,因为我们既需要点标签又需要内容标签所以通过修改宏定义的方式是不现实的,只能重新构造一个我们自己的内容标签类。
当然直接拷贝cc2DLabel类对象中的内容,修改逻辑相对比较简单
有了大概的代码分析之后,实际哪些是需要的哪些是不需要的以及执行逻辑只需要打几个断点DEBUG一就OK了
自定义标签实际效果如下:
六、QT使用中相关问题:
1.在 QT 中与在 VS中 互传之后结构不一致问题
可能是两个IDE之间默认的编码不一致的导致,在指针传递的时候直接异常崩溃,可能是类内部结构在不同的平台上编译是不同的。(暂未处理)
2.QT debug时候无法查看变量的内存值时候
清除然后重新构建一下项目即可
cmake项目记得需要重新cmake一下
3.QT 的cmake 项目中 语言文件
xxxx(项目名称)_zh_CN.ts
在拷贝复制UI相关的项目文件中如果存在更改需要一起带上
4.项目工程构建生成缓存的重要文件
.ninja_deps
.ninja_log
build.ninja
cmake_install.cmake
CMakeCache.txt
CMakeCache.txt.prev
qtcsettings.cmake