#include "Mainwindow.h"
#include<iostream>
#include <topology/TopoFace.hpp>
#include <topology/TopoExplorerTool.hpp>
#include <topology/TopoEdge.hpp>
#include <topology/TopoTool.hpp>
#include <geometry/MakeCircle2.hpp>
#include <geometry/MakeEllipse2.hpp>
#include <modeling/MakeCylinder.hpp>
#include <modeling/MakeEdge.hpp>
#include <geometry/MakeGeom2Circle.hpp>
#include <modeling/MakeBox.hpp>
#include <topology/BRepAdaptorSurface.hpp>
Mainwindow::Mainwindow(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
mRender = mRenderComponent->CreateBasicRender();
ui.gridLayout->addWidget(mRender->widget);
connect(ui.pushButton_2d, &QPushButton::clicked, this, &Mainwindow::Create2DTexture);
connect(ui.pushButton_3d, &QPushButton::clicked, this, &Mainwindow::Create3DTexture);
}
Mainwindow::~Mainwindow()
{
}
void Mainwindow::Create3DTexture()
{
AMCAX::Point3 point;
AMCAX::Vector3 du, dv, nomal;
surface.D1(u, v, point, du, dv);
nomal = du.Cross(dv);
data.points.insert(data.points.end(), { point.X(),point.Y(),point.Z() });
data.normals.insert(data.normals.end(), { nomal.X(),nomal.Y(),nomal.Z() });
data.colors.insert(data.colors.end(), { (unsigned char)(rand() % 255), (unsigned char)(rand() % 255), 0 });
data.angles.insert(data.angles.end(), { 45 });
};
AMCAX::TopoShape model;
AMCAX::TopoFace ReferenceFace;
AMCAX::TopoShape shape;
#if 1
AMCAX::Frame3 frame(AMCAX::Point3(0., 0., 0.), AMCAX::Direction3(0.0, 0.0, 1.0));
double radius = 2.0;
double height = 5.0;
AMCAX::MakeCylinder mkCylinder = AMCAX::MakeCylinder(frame, radius, height);
ReferenceFace = mkCylinder.Face();
model = static_cast<const AMCAX::TopoShape&>(ReferenceFace);
#else
model = AMCAX::MakeBox(10, 10, 10);
AMCAX::IndexSet<AMCAX::TopoShape> shapeFaces_;
AMCAX::TopoExplorerTool::MapShapes(model, AMCAX::ShapeType::Face, shapeFaces_);
ReferenceFace = static_cast<const AMCAX::TopoFace&>(shapeFaces_[1]);
#endif
mRender->entityManage->AddEntity(mRender->entityFactory->FromShape(model));
shape = AMCAX::MakeBox(0.1, 0.1, 0.1);
AMCAX::BRepAdaptorSurface adapt(ReferenceFace);
double uFirst = adapt.FirstUParameter();
double uLast = adapt.LastUParameter();
double vFirst = adapt.FirstVParameter();
double vLast = adapt.LastVParameter();
auto entity = mRender->entityFactory->FromShape(shape);
int size = 20;
int size2 = 20;
auto ustep = (uLast - uFirst) / size;
auto vstep = (vLast - vFirst) / size2;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size2; j++) {
F_ConstructTexureData(adapt, uFirst + i * ustep, vFirst + j * vstep, data);
}
}
att->CreateTexture(entity, data);
mRender->pluginManage->SetProperty(id, att);
mRender->entityManage->DoRepaint();
mRender->cameraManage->ResetCamera();
}
void Mainwindow::Create2DTexture()
{
AMCAX::TopoShape model;
AMCAX::TopoFace ReferenceFace;
AMCAX::TopoShape shape;
model = AMCAX::MakeBox(10, 10, 10);
AMCAX::IndexSet<AMCAX::TopoShape> shapeFaces_;
AMCAX::TopoExplorerTool::MapShapes(model, AMCAX::ShapeType::Face, shapeFaces_);
ReferenceFace = static_cast<const AMCAX::TopoFace&>(shapeFaces_[1]);
mRender->entityManage->AddEntity(mRender->entityFactory->FromShape(model));
AMCAX::BRepAdaptorSurface adapt(ReferenceFace);
double uFirst = adapt.FirstUParameter();
double uLast = adapt.LastUParameter();
double vFirst = adapt.FirstVParameter();
double vLast = adapt.LastVParameter();
auto entity = mRender->entityFactory->FromShape(shape);
auto att = mRender->pluginManage->GetProperty<AMCAXRender::TextureProp2D>(id);
auto rect = std::make_shared<AMCAXRender::TextureProp2D::RectShape>();
rect->w = 0.5;
rect->h = 0.5;
auto circle = std::make_shared<AMCAXRender::TextureProp2D::CircleShape>();
circle->radius = 0.02;
auto ellipse = std::make_shared<AMCAXRender::TextureProp2D::EllipseShape>();
ellipse->d = { 1,0 };
ellipse->majorRadius = 0.315;
ellipse->minorRadius = 3.1415926 / 180 * 18;
AMCAXRender::TextureProp2D::TextureData data;
data.shape = rect;
int size = 5;
int size2 = 5;
auto ustep = (uLast - uFirst) / size;
auto vstep = (vLast - vFirst) / size2;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size2 + 0; j++) {
data.uvPos.push_back({ uFirst + i * ustep ,vFirst + j * vstep });
data.colors.push_back({ (rand() % 255) ,(rand() % 255),0 });
data.scales.push_back({ 2.0 ,1.5 });
data.angle.push_back(45.0);
}
}
att->SetTranslate(0, 5, 5);
att->SetRotateWXYZ(45, 1, 0, 0);
att->SetTranslate(0, -5, -5);
att->CreateTexture(ReferenceFace, data);
{
std::vector<AMCAX::TopoEdge> region;
AMCAX::Point2 center(5.0, -5.0);
double cRadius = 5.0;
AMCAX::Circle2 circle2 = AMCAX::MakeCircle2(center, cRadius);
auto theCurve = AMCAX::MakeGeom2Circle(circle2).Value();
std::shared_ptr<AMCAX::Geom3Surface> cySurface = AMCAX::TopoTool::Surface(ReferenceFace);
AMCAX::TopoEdge
edge = AMCAX::MakeEdge(theCurve, cySurface);
region.push_back(edge);
att->ClipByRegion(region);
att->SetClipToolsVisible(1);
}
std::vector<uint32_t> interIds;
std::vector<uint32_t> insideIds;
std::vector<uint32_t> outsideIds;
att->GetIntersectionIds(interIds, insideIds, outsideIds);
std::cout << "insideCount : " << insideIds.size() << " outsideCount : " << outsideIds.size() << " interCount : " << interIds.size() << std::endl;
mRender->pluginManage->SetProperty(id, att);
mRender->entityManage->DoRepaint();
mRender->cameraManage->ResetCamera();
}
AMCAX_RENDER_API std::shared_ptr< IRenderComponent > CreateRenderComponent(QWidget *parent)
Create Render Component
@ kTextureProp
TextureProp
定义 Constants.h:236
@ kTexture2D
Texture2D
定义 Constants.h:237
@ edge
Edge Pick
定义 Constants.h:103
TextureProp
定义 PluginProperty.h:590
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainwindowClass</class>
<widget class="QWidget" name="MainwindowClass">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>400</height>
</rect>
</property>
<property name="windowTitle">
<string>Mainwindow</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout"/>
</item>
<item row="0" column="0">
<widget class="QFrame" name="frame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QPushButton" name="pushButton_2d">
<property name="text">
<string>2d</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_3d">
<property name="text">
<string>3d</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>419</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>