二维异形排版效果如下:
CAD二维异形排版,支持凹多边形,采用NFP算法,部分代码如下:
public void 异形排版()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
Editor ed = doc.Editor;
num = 0;
// 选择母材和待排版零件
var basepl = db.SelectEntity<Polyline>("请选择母材:");
if (basepl == null) return;
var partsPLs = db.SelectEntities<Polyline>("请选择待排版零件:");
if (partsPLs == null || partsPLs.Count == 0) return;
var partsPLsorted = partsPLs.OrderByDescending(p => p.Area).ToList();
var placedParts = new List<Polyline>();
var baseM = basepl.Path64_World();
var basesm = new Paths64 { baseM };
// 1. 处理第一个零件
var firstPartPL = partsPLsorted[0];
var firstPartPath64 = firstPartPL.Path64_World();
var PlaceablePaths = baseM.Nfp内部Paths64(firstPartPath64);
if (PlaceablePaths == null || PlaceablePaths.Count == 0)
{
ed.WriteMessage("\n第一个零件无可用摆放区域");
return;
}
// 摆放第一个零件
var firstPlacedPL = PlaceSinglePart(firstPartPL, PlaceablePaths, 1);
placedParts.Add(firstPlacedPL);
// 2. 处理第二个零件
if (partsPLsorted.Count >= 2)
{
var secondPartPL = partsPLsorted[1];
var part2内部 = basepl.Nfp内部(secondPartPL);
var part2外部 = firstPlacedPL.Nfp外部(secondPartPL);
if (part2内部 == null || part2外部 == null)
{
ed.WriteMessage("\n第二个零件无可用摆放区域");
}
else
{
var part2可摆放 = Clipper.Difference(
part2内部.Path64s_World(),
part2外部.Path64s_World(),
FillRule.NonZero
);
var templ = part2可摆放.ToPolylines();
if (part2可摆放 != null && part2可摆放.Count > 0)
{
var secondPlacedPL = PlaceSinglePart(secondPartPL, part2可摆放, 2);
placedParts.Add(secondPlacedPL);
}
else
{
ed.WriteMessage("\n第二个零件无可用摆放区域");
}
}
}
// 3. 处理第三个及后续零件
ed.WriteMessage($"\n排版完成!共摆放 {placedParts.Count} 个零件");
}
4037

被折叠的 条评论
为什么被折叠?



