
# 实施步骤
#### 准备工作
1. 开发技能
   - 熟悉C++语言，能够编写C++语言代码。
   
   - 熟悉CAX软件功能。
   
   - 了解OCCT几何建模相关知识。
   
   - 了解C++构建相关工具（cmake等）
    
2. 开发环境
   - Windows 10+
     - Visual Studio 2017+或适用于Visual Studio 2017+的Microsoft Visual生成工具
     
     - CMake 3.7+
      
   
   - Linux：
     - gcc g++ gdb
     
     - CMake 3.7+
      
    
 
#### 操作步骤
1. 读取STEP文件。
   ```
   Ncad::Exchange::STEPReader reader;
   reader.ReadFile("model_name.stp");
   const ShapePtr inputShape = reader.GetOneShape();
   ```
   
2. （可选）创建基础实体（如盒子、锥体、圆柱、球体、圆环）。
   ```
   // Prepare data.
   const DirPtr oz = std::make_shared<Ncad::Base::Dir>(0.0, 0.0, 1.0);
   const Ax2Ptr cylAxis = std::make_shared<Ncad::Base::Ax2>(origin, oz);
   // Create cylinder.
   Ncad::Prim::Cylinder cylBuilder(cylAxis, 5.0, 10.0);
   cylBuilder.Perform();
   const ShapePtr cyl = cylBuilder.GetResult();
   ```
   
3. （可选）执行布尔操作。
   布尔操作是指一组允许使用类似于布尔代数的方法融合、切割或分割形状的操作。NCAD支持的布尔操作类型包括：FUSE（融合）、CUT（切割）、COMMOM（并集）、SPILT（分割）。以下是布尔CUT的调用示例：
   ```
   Ncad::Modify::Boolean bopAlgo(box, cyl, Ncad::Modify::Boolean::BOP_CUT);
   const ShapePtr bopRes = bopAlgo.GetResult();
   ```
   
4. 创建圆角和倒角。
   - 圆角是在两个或多个相交或相邻边缘之间创建平滑过渡或曲率的过程。
   
   - 倒角是沿着形状的边缘或角落创建平面或有角度的切口的过程。
   
   
   ```
   // Edges to be filleted.
   ListOfShape edges;
   std::set<int> edgeIndices = {3, 9, 13};
   Ncad::Base::ShapeExplorer exp(bopRes, Ncad::Base::Shape::EDGE);
   for (int index = 1; exp.More(); exp.Next(), ++index)
       if (edgeIndices.find(index) != edgeIndices.end())
           edges.push_back(exp.Current());
   // Fillet creation.
   static constexpr double radius = 1.0;
   Ncad::Modify::Fillet filletAlgo(bopRes, edges, radius);
   ShapePtr result = filletAlgo.GetResult();
   ```
   
5. 缺陷检测。
   ```
   // detection of problems
    Ncad::Analysis::DefectConfig config(1.0e-4);
    Ncad::Analysis::CheckShape checker(config);
    const bool isValid = checker.IsValid(inputShape);
    if (isValid) {
         std::cout << "Input shape is valid" << std::endl;
         return 0;
    }
    std::list<FaultyShapePtr> faulties = checker.GetFaultiesByID(Ncad::Analysis::DefectID::GEOM_SELF_INTERSECTION);
    std::cout << "Input shape has faulties. Launching shape healing." << std::endl;
   ```
   
6. 执行形状修复。
   ```
   std::list<Ncad::Guid> repairs = {Ncad::Healing::repairSILoopBySplitting(),Ncad::Healing::repairSISurfaceBySplitting()};
   config.SetDefectRepairs(Ncad::Analysis::DefectID::GEOM_SELF_INTERSECTION, repairs);
   Ncad::Healing::FixShape healer(config);
   const bool isFixed = healer.Fix(faulties);
   ShapePtr resultShape = healer.GetResult();
   std::cout << "healing is performed" << std::endl;
   ```
   
7. 几何特征识别。 NCAD支持钻孔检测、凹槽检测、空腔检测及隔离特征检测等检测算法。以下是钻孔识别检测的调用示例：
   ```
   Ncad::Feature::DrilledHolesDetector dhDetector(shape);
   dhDetector.Perform();
   const std::vector<std::set<int>>& drilledHoles = dhDetector.GetAllFeatureIds();
   ```
   
8. 几何特征移除。
   ```
   // read indices of faces to be removed
   std::set<int> faceIndices;
   for (int i = 3; i < argc; ++i)
      faceIndices.insert(atoi(argv[i]));
   std::cout << "indices are loaded" << std::endl;
   // convert indices into faces to remove
   ListOfShape faces2remove;
   Ncad::Base::ShapeExplorer exp(inputShape, Ncad::Base::Shape::FACE);
   for (int index = 1; exp.More(); exp.Next(), ++index)
      if (faceIndices.find(index) != faceIndices.end())
         faces2remove.push_back(exp.Current());
   // defeaturing
   Ncad::Modify::AdvancedDefeaturing advDef(inputShape, faces2remove);
   advDef.Perform();
   ShapePtr resultShape = advDef.GetResult();
   std::cout << "Defeaturing is performed" << std::endl;
   ```
   
9. 将结果文件写入成STEP文件。
   ```
   Ncad::Exchange::STEPWriter writer;
   writer.WriteShape(shape, "path_to_file");
   ```
   
 
#### 常见问题
**Q：Windows和Linux环境的编译兼容性问题**
**A：**
- Windows环境
  - 编译器兼容性问题：
    - 在Windows上，不同的C++编译器（如Visual C++、MinGW等）可能会与SDK的构建系统产生兼容性问题。例如，SDK可能在构建过程中依赖特定的编译器特性或标准库实现，而Visual C++和MinGW在某些C++标准支持程度上有所差异。
    
    - 对于依赖的其他库（如FreeType），其头文件和库文件路径也需要正确地添加到项目的包含路径和库路径环境变量中。如果这些路径设置不正确，在编译过程中会出现头文件无法找到或链接库错误的情况。
     
  
  - DLL依赖问题： 一些库可能以动态链接库（DLL）的形式提供，在Windows上运行时，可能会出现DLL缺失或版本不匹配的问题。
    
   
- Linux环境
  - 包管理器依赖问题：
    - SDK需要特定版本的运行时g++库支持C++语言特性，但系统默认的版本可能较旧，导致在构建过程中出现语法错误。
    
    - 在Linux不同发行版存在不同，这可能会导致在安装和配置过程中出现混淆。
     
  
  - 权限问题： 对于使用多用户环境的情况，不同用户可能对SDK相关的文件和目录有不同的权限。这可能会导致一些用户能够成功构建和运行应用，而其他用户则因为权限问题无法进行相同的操作。
    
  
  - 库路径和链接问题：
    1. Linux系统在链接库文件时，依赖于特定的库路径设置（如LD_LIBRARY_PATH环境变量）。如果这些路径没有正确设置，应用可能无法找到所需的共享库。例如，在运行时应用可能无法加载OCCT库，因为系统无法在指定的库路径中找到该库。
    
    2. 与Windows不同，Linux上的库文件命名和版本管理遵循一定的规则（如.so文件的命名和版本号约定）。如果库文件的名称或版本不符合这些规则，或者在链接过程中指定了错误的库名称或版本，会导致链接错误。
     
   
**Q：** **为什么使用SDK时，抛出了许可证相关的异常？**
**A：**请检查许可证的有效性，例如产品名称是否匹配，是否超过有效期限，并使用有效的许可证。
