我来自工程 CAD 领域,我正在 CadQuery 中创建一些设计。我想做的是这个(伪代码):
edges = part.edges()
edges[n].fillet(r)
或者理想情况下有能力做这样的事情(尽管我找不到任何边缘属性的方法)。伪代码:
edges = part.edges()
for edge in edges:
if edge.length() > x:
edge.fillet(a)
else:
edge.fillet(b)
当设计包含非正交面时,这将非常有用。我知道我可以使用选择器选择边缘,但我发现它们不必要地复杂,并且最适合正交面。 FreeCAD 允许您将边视为列表。
我相信可能有一种方法可以选择最接近某个点的边缘,但我似乎无法找到它。
如果有人可以提供指导那就太好了——谢谢!
额外问题:有没有办法以列表或向量的形式返回几何坐标?例如:
origin = cq.workplane.center().val
>> [x,y,z]
(或者类似上面的东西)
为了子孙后代。选择多个边,例如。对于倒角,您可以在
newObject()
上使用 Workplane
。参数是边列表(它们必须是 cq.occ_impl.shapes.Edge
实例,而不是 cq.Workplane
实例)。
import cadquery as cq
model = cq.Workplane().box(10, 10, 5)
edges = model.edges()
# edges.all() returns worplanes, we have to get underlying geometry
selected = list(map(lambda x: x.objects[0], edges.all()))
model_with_chamfer = model.newObject(selected).chamfer(1)
要获得边长,你可以这样做:
edge = model.edges().all()[0] # This select one 'random' edge
length = edge.objects[0].Length()
edge.Length()
不起作用,因为边缘是 Workplane
实例,而不是几何实例。
要获得一定长度的边缘,您只需创建具有边缘几何形状和长度的字典,并使用内置 python 的
filter()
对其进行过滤。这是我在最上面的面上倒角短边的实现的片段:
top_edges = model.edges(">Z and #Z")
def get_length(edge):
try:
return edge.vals()[0].Length()
except Exception:
return 0.0
# Inside edges are shorter - filter only those
edge_len_list = list(map(
lambda x: (x.objects[0], get_length(x)),
top_edges.all()))
avg = mean([a for _, a in edge_len_list])
selected = filter(lambda x: x[1] < avg, edge_len_list)
selected = [e for e, _ in selected]
vertical_edges = model.edges("|Z").all()
selected.extend(vertical_edges)
model = model.newObject(selected)
model = model.chamfer(chamfer_size)
看一下这段代码,希望对您有所帮助。
import cadquery as cq
plane1 = cq.Workplane()
block = plane1.rect(10,12).extrude(10)
edges = block.edges("|Z")
filleted_block = edges.all()[0].fillet(0.5)
show(filleted_block)
base = (
cq.Workplane("XY").box(50,60,15)
.faces(">Z")
.rect(30,30,forConstruction=True)
.vertices().rect(10,5).cutBlind(until=-10)
)
edges = base.edges("|Z").all()
edges.sort( key=(lambda x: x.val().Length() ))
for ed in edges[:-4]:
base = base.union( ed.fillet(2))