我有一个关于如何在pythonOCC中使用样条线的两部分问题.
首先,我知道我可以创建样条曲线
array = []
array.append(gp_Pnt2d (0,0))
array.append(gp_Pnt2d (1,2))
array.append(gp_Pnt2d (2,3))
array.append(gp_Pnt2d (4,3))
array.append(gp_Pnt2d (5,5))
pt2d_list = point2d_list_to_TColgp_Array1OfPnt2d(array)
SPL1 = Geom2dAPI_PointsToBSpline(pt2d_list).Curve()
display.DisplayShape(make_edge2d(SPL1) , update=True)
Run Code Online (Sandbox Code Playgroud)
我希望bspline可以通过计算得出
BSPL1 = Geom2dAPI_PointsToBSpline(pt2d_list)
Run Code Online (Sandbox Code Playgroud)
但我怎么得到:
如何删除或添加bspline的结?
其次,在pythonOCC中加载CAD绘图.stp文件时,如下所示:
from OCC import TopoDS, StlAPI
shape = TopoDS.TopoDS_Shape()
stl_reader = StlAPI.StlAPI_Reader()
stl_reader.Read(shape,str(filename))
display.DisplayShape(shape)
Run Code Online (Sandbox Code Playgroud)
如何从knot,bspline和coefficient等形状中获取数据.
我的最终目标如下:
我有一个巨大的点数据集,表示一个部件将如何逐层3D打印.我需要通过这些点创建一条直线并沿着这条直线挤出一个圆(所以重建部件,因为它将在以后打印).
我最初尝试使用样条曲线,但是这会尝试创建一条平滑线并且根本不遵循这些点.我尝试更改minDeg和maxDeg选项,但这仍然没有足够的帮助来创建我需要的实际曲线.
所以我一次尝试在两个点之间创建一个样条线,然后在创建一条线时将它们全部加在一起.这看起来很有希望,因为现在我确实得到了实际的尖角和线条通过精确点.但是,现在当我尝试沿着它挤出时,挤出型材的法线不会随着钢丝的角度而变化.
我花了最近4天的时间来解决这个问题,尝试了很多论坛和问题,但感觉完全迷失在pythonocc(opencascade)的世界里.
我的代码如下:
from __future__ import print_function
from OCC.gp import gp_Pnt, gp_Ax2, gp_Dir, gp_Circ
from OCC.GeomAPI import GeomAPI_PointsToBSpline
from OCC.TColgp import TColgp_Array1OfPnt
from OCC.BRepBuilderAPI import BRepBuilderAPI_MakeEdge,
BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeFace
from OCC.BRepOffsetAPI import BRepOffsetAPI_MakePipe
from OCC.Display.SimpleGui import init_display
display, start_display, add_menu, add_function_to_menu = init_display()
def pipe():
# the bspline path, must be a wire
# This will later be in a for loop but this is merely to validate the method
using three different points.
array …Run Code Online (Sandbox Code Playgroud) 所有
具有来自CAD(SW)的STEP格式文件,并能够通过Python OCC绑定读取文件:
importer = aocxchange.step.StepImporter(fname)
shapes = importer.shapes
shape = shapes[0]
# promote up
if (shape.ShapeType() == OCC.TopAbs.TopAbs_SOLID):
sol = OCC.TopoDS.topods.Solid(shape)
Run Code Online (Sandbox Code Playgroud)
我可以显示它,戳它,检查标志等
t = OCC.BRepCheck.BRepCheck_Analyzer(sol)
print(t.IsValid())
print(sol.Checked())
print(sol.Closed())
print(sol.Convex())
print(sol.Free())
print(sol.Infinite())
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。它确实看起来像是沿着某些复杂路径弯曲的小管。
问题:如何从已有的几何特征中提取几何特征?我真的需要电子管参数及其遵循的路径。用Python和/或C ++编写的任何好的示例都很好
我测试过两种情况:
我使用 STEPCAFControl_Reader 然后 STEPControl_Reader 来读取我的步骤文件,但是当我分别调用 STEPCAFControl_Reader::Transfer 和 STEPControl_Reader:: TransferRoots 时,这两种方法都会崩溃。
通过使用 STEPControl_Reader,我在控制台上显示了一条日志,然后出现如下消息:
1 F:(BOUNDED_SURFACE、B_SPLINE_SURFACE、B_SPLINE_SURFACE_WITH_KNOTS、GEOMETRIC_REPRESENTATION_ITEM、RATIONAL_B_SPLINE_SURFACE、REPRESENTATION_ITEM、SURFACE):representation_item 的参数计数不为 1
编辑:
TransferRoots() 方法内有一个空引用。
const Handle(Transfer_TransientProcess) &proc = thesession->TransferReader()->TransientProcess();
if (proc->GetProgress().IsNull())
{
//This condition does not exist from the source code
std::cout << "GetProgress is null" << std::endl;
return 0;
}
Message_ProgressSentry PS ( proc->GetProgress(), "Root", 0, nb, 1 );
Run Code Online (Sandbox Code Playgroud)
我的应用程序和 FreeCAD 崩溃,但如果我使用 CAD Assitant(OCC 官方查看器),它会加载。
我正在寻找一种方法来治愈至少我必须使用的漏洞DLL的症状.虽然库(OpenCascade)声称提供了一个内存管理器,但我还是无法释放它分配的任何内存.
我至少希望将这个模块的调用放在"沙箱"中,以便在OCC模块甚至不再运行时保持我的应用程序不会丢失内存.
我的问题是:虽然我意识到这将是一个UGLY HACK(TM)这样做,是否可以预先分配一段内存供图书馆专门使用,或者围绕它构建某种沙盒以便我可以跟踪他们使用的内存区域,以便在我完成时自行释放它们?
或者那是丑陋的黑客,我应该尝试解决问题呢?
最近我一直在使用OpenCASCADE(准确地说是PythonOCC)进行一些CAD操作,包括网格形状,并偶然发现了这个类: BRepMesh_IncrementalMesh.
我没有找到关于什么theLinDeflection和theAngDeflection参数含义的任何暗示- 并且想要了解更多关于此的信息.
我将不胜感激任何关于这一主题的阅读材料/提示/解释.
使用 OpenCascade C++ 库时,某些函数会向控制台/终端打印一些状态或响应。例如STEPCAFControl_Writer::perform()将打印出如下内容:
*******************************************************************
****** Statistics on Transfer (Write) ******
*******************************************************************
****** Transfer Mode = 0 I.E. As Is ******
****** Transferring Shape, ShapeType = 0 ******
** WorkSession : Sending all data
Step File Name : <file-name> Write Done
Run Code Online (Sandbox Code Playgroud)
到控制台。有办法防止这种情况吗?
我目前正在将在MS VS2005中开发的c ++应用程序移植到linux,不幸的是,这是我第一次这样做。我们正在使用Qt 4.6,Opencascade 6.5.1和Qwt 6.0.1。大多数代码都可以正常编译,但有一次我们试图使用X来确定客户端屏幕的大小,而一旦我试图包含X库,我就会遇到很多错误。类头包含以下几行:
#ifdef WNT
#include <windows.h>
#else
#include <X11/X.h>
#include <X11/Xlib.h>
#endif //WNT
Run Code Online (Sandbox Code Playgroud)
当我只有#include <X11/X.h>一行时,出现以下错误:
In file included from v0000/plot_curve.h:7,
from v0000/utility.h:9,
from v0000/settings.h:16,
from v0000/dialog.cpp:10:
../../../qwt-6.0.1/include/qwt_symbol.h:35: error: expected identifier before numeric constant
../../../qwt-6.0.1/include/qwt_symbol.h:35: error: expected `}' before numeric constant
... <many more of these in this file>
In file included from v0000/plot_curve.h:7,
from v0000/utility.h:9,
from v0000/settings.h:16,
from v0000/dialog.cpp:10:
../../../qwt-6.0.1/include/qwt_symbol.h:10:1: unterminated #ifndef
In file included from v0000/utility.h:9,
from v0000/settings.h:16,
from v0000/dialog.cpp:10:
v0000/plot_curve.h:1:1: unterminated …Run Code Online (Sandbox Code Playgroud)