251 lines
11 KiB
C#
251 lines
11 KiB
C#
using System;
|
||
using Autodesk.AutoCAD.DatabaseServices;
|
||
using Autodesk.AutoCAD.Geometry;
|
||
using CadParamPluging.Common;
|
||
|
||
namespace CadParamPluging.Cad
|
||
{
|
||
/// <summary>
|
||
/// 半剖视图绘制器 - 已重构为特征驱动模式
|
||
/// 新的绘制逻辑在 FeatureDrivenDrawer 中实现
|
||
/// </summary>
|
||
public static class HalfSectionDrawer
|
||
{
|
||
/// <summary>
|
||
/// 绘制图形(特征驱动模式)
|
||
/// </summary>
|
||
/// <param name="ctx">CAD上下文</param>
|
||
/// <param name="bag">参数包 - 根据存在的参数动态绘制对应特征</param>
|
||
/// <param name="deliveryStatus">交付状态(毛料态/车加工态)</param>
|
||
/// <param name="structuralFeature">结构特征(环形/饼盘/轴杆/方体)</param>
|
||
/// <param name="specialCondition">特殊条件(中心冲孔/有圆头等)</param>
|
||
/// <param name="processMethod">工艺方法(轧制/自由锻)</param>
|
||
/// <param name="center">绘图中心点</param>
|
||
/// <param name="scaleFactor">缩放比例(1.0表示不缩放)</param>
|
||
public static void Draw(CadContext ctx, ParamBag bag, string deliveryStatus, string structuralFeature,
|
||
string specialCondition = null, string processMethod = null, Point3d? center = null, double scaleFactor = 1.0)
|
||
{
|
||
// 委托给特征驱动绘图引擎
|
||
FeatureDrivenDrawer.Draw(ctx, bag, deliveryStatus, structuralFeature, specialCondition, processMethod, center, scaleFactor);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 兼容旧接口
|
||
/// </summary>
|
||
[Obsolete("请使用新的 Draw 方法,支持 specialCondition 和 processMethod 参数")]
|
||
public static void DrawLegacy(CadContext ctx, ParamBag bag, string deliveryStatus, string structuralFeature, Point3d? center = null)
|
||
{
|
||
Draw(ctx, bag, deliveryStatus, structuralFeature, null, null, center);
|
||
}
|
||
|
||
#region 旧代码保留供参考(已废弃)
|
||
|
||
private static bool IsRing(string feature)
|
||
{
|
||
return !string.IsNullOrWhiteSpace(feature)
|
||
&& feature.IndexOf("环形", StringComparison.OrdinalIgnoreCase) >= 0;
|
||
}
|
||
|
||
private static bool IsDisk(string feature)
|
||
{
|
||
return !string.IsNullOrWhiteSpace(feature)
|
||
&& (feature.IndexOf("饼盘", StringComparison.OrdinalIgnoreCase) >= 0
|
||
|| feature.IndexOf("饼", StringComparison.OrdinalIgnoreCase) >= 0
|
||
|| feature.IndexOf("盘", StringComparison.OrdinalIgnoreCase) >= 0);
|
||
}
|
||
|
||
private static bool IsShaft(string feature)
|
||
{
|
||
return !string.IsNullOrWhiteSpace(feature)
|
||
&& (feature.IndexOf("轴杆", StringComparison.OrdinalIgnoreCase) >= 0
|
||
|| feature.IndexOf("轴", StringComparison.OrdinalIgnoreCase) >= 0
|
||
|| feature.IndexOf("杆", StringComparison.OrdinalIgnoreCase) >= 0);
|
||
}
|
||
|
||
private static bool IsBlock(string feature)
|
||
{
|
||
return !string.IsNullOrWhiteSpace(feature)
|
||
&& feature.IndexOf("方体", StringComparison.OrdinalIgnoreCase) >= 0;
|
||
}
|
||
|
||
private static bool IsMachined(string deliveryStatus)
|
||
{
|
||
return !string.IsNullOrWhiteSpace(deliveryStatus)
|
||
&& deliveryStatus.IndexOf("车加工", StringComparison.OrdinalIgnoreCase) >= 0;
|
||
}
|
||
|
||
[Obsolete("已迁移到 FeatureDrivenDrawer")]
|
||
private static void DrawRingLegacy(CadContext ctx, ParamBag bag, string deliveryStatus, Point3d center)
|
||
{
|
||
var db = ctx.Database;
|
||
var tr = ctx.Transaction;
|
||
var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
|
||
|
||
// 读取尺寸
|
||
double outerDia = bag.GetDouble("OuterDiameter1");
|
||
double innerDia = bag.GetDouble("InnerDiameter2");
|
||
double height = bag.GetDouble("Height1");
|
||
|
||
if (outerDia <= 0 || height <= 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 计算偏移量,使图形居中于 center
|
||
// 图形原本以 (0,0) 为左端中心,宽度为 height,需要偏移使其居中
|
||
double ox = center.X - height / 2.0;
|
||
double oy = center.Y;
|
||
|
||
// 绘制水平圆柱 (侧视图)
|
||
// 中心线 (X轴) - 已移除,以匹配参考图样式
|
||
|
||
// 1. 锻件外轮廓
|
||
double R = outerDia / 2.0;
|
||
var polyForging = new Polyline();
|
||
polyForging.AddVertexAt(0, new Point2d(ox + 0, oy - R), 0, 0, 0);
|
||
polyForging.AddVertexAt(1, new Point2d(ox + height, oy - R), 0, 0, 0);
|
||
polyForging.AddVertexAt(2, new Point2d(ox + height, oy + R), 0, 0, 0);
|
||
polyForging.AddVertexAt(3, new Point2d(ox + 0, oy + R), 0, 0, 0);
|
||
polyForging.Closed = true;
|
||
polyForging.ColorIndex = 7; // 白色
|
||
|
||
btr.AppendEntity(polyForging);
|
||
tr.AddNewlyCreatedDBObject(polyForging, true);
|
||
|
||
// 3. 内孔轮廓 (虚线)
|
||
if (innerDia > 0)
|
||
{
|
||
double r = innerDia / 2.0;
|
||
TryLoadLinetype(db, tr, "DASHED");
|
||
|
||
var lineHiddenTop = new Line(new Point3d(ox + 0, oy + r, 0), new Point3d(ox + height, oy + r, 0));
|
||
lineHiddenTop.ColorIndex = 2; // 黄色
|
||
lineHiddenTop.Linetype = "DASHED";
|
||
btr.AppendEntity(lineHiddenTop);
|
||
tr.AddNewlyCreatedDBObject(lineHiddenTop, true);
|
||
|
||
var lineHiddenBot = new Line(new Point3d(ox + 0, oy - r, 0), new Point3d(ox + height, oy - r, 0));
|
||
lineHiddenBot.ColorIndex = 2;
|
||
lineHiddenBot.Linetype = "DASHED";
|
||
btr.AppendEntity(lineHiddenBot);
|
||
tr.AddNewlyCreatedDBObject(lineHiddenBot, true);
|
||
|
||
// 内孔标注
|
||
AddLinearDim(db, tr, btr, new Point3d(ox + 0, oy + r, 0), new Point3d(ox + 0, oy - r, 0),
|
||
new Point3d(ox + height + 15, oy, 0), 90, $"%%c{innerDia}");
|
||
}
|
||
|
||
// 外径标注
|
||
AddLinearDim(db, tr, btr, new Point3d(ox + 0, oy + R, 0), new Point3d(ox + 0, oy - R, 0),
|
||
new Point3d(ox - 15, oy, 0), 90, $"%%c{outerDia}");
|
||
|
||
// 长度标注
|
||
AddLinearDim(db, tr, btr, new Point3d(ox + 0, oy - R, 0), new Point3d(ox + height, oy - R, 0),
|
||
new Point3d(ox + height / 2, oy - R - 15, 0), 0, $"{height}min");
|
||
|
||
// 4. 车加工零件 (填充)
|
||
if (IsMachined(deliveryStatus))
|
||
{
|
||
double outerDiaPrime = bag.GetDouble("OuterDiameter1Prime");
|
||
double innerDiaPrime = bag.GetDouble("InnerDiameter2Prime");
|
||
double heightPrime = bag.GetDouble("Height1Prime");
|
||
|
||
if (outerDiaPrime > 0 && heightPrime > 0)
|
||
{
|
||
double offsetX = (height - heightPrime) / 2.0;
|
||
double Rp = outerDiaPrime / 2.0;
|
||
|
||
// 零件轮廓
|
||
var polyPart = new Polyline();
|
||
polyPart.AddVertexAt(0, new Point2d(ox + offsetX, oy - Rp), 0, 0, 0);
|
||
polyPart.AddVertexAt(1, new Point2d(ox + offsetX + heightPrime, oy - Rp), 0, 0, 0);
|
||
polyPart.AddVertexAt(2, new Point2d(ox + offsetX + heightPrime, oy + Rp), 0, 0, 0);
|
||
polyPart.AddVertexAt(3, new Point2d(ox + offsetX, oy + Rp), 0, 0, 0);
|
||
polyPart.Closed = true;
|
||
polyPart.ColorIndex = 7;
|
||
|
||
btr.AppendEntity(polyPart);
|
||
tr.AddNewlyCreatedDBObject(polyPart, true);
|
||
|
||
// 填充
|
||
try
|
||
{
|
||
var hatch = new Hatch();
|
||
hatch.SetDatabaseDefaults();
|
||
hatch.Normal = new Vector3d(0, 0, 1);
|
||
hatch.Elevation = 0.0;
|
||
|
||
btr.AppendEntity(hatch);
|
||
tr.AddNewlyCreatedDBObject(hatch, true);
|
||
|
||
hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31");
|
||
hatch.PatternScale = 10;
|
||
hatch.PatternAngle = 0;
|
||
hatch.Associative = false;
|
||
hatch.ColorIndex = 4; // 青色
|
||
hatch.LineWeight = LineWeight.LineWeight025; // 0.25mm线宽
|
||
|
||
var ids = new ObjectIdCollection();
|
||
ids.Add(polyPart.ObjectId);
|
||
hatch.AppendLoop(HatchLoopTypes.External, ids);
|
||
hatch.EvaluateHatch(true);
|
||
}
|
||
catch
|
||
{
|
||
// 忽略
|
||
}
|
||
|
||
// 可以在这里添加零件尺寸标注
|
||
AddLinearDim(db, tr, btr, new Point3d(ox + offsetX, oy + Rp, 0), new Point3d(ox + offsetX, oy - Rp, 0),
|
||
new Point3d(ox + offsetX - 5, oy, 0), 90, $"%%c{outerDiaPrime}");
|
||
|
||
AddLinearDim(db, tr, btr, new Point3d(ox + offsetX, oy - Rp, 0), new Point3d(ox + offsetX + heightPrime, oy - Rp, 0),
|
||
new Point3d(ox + offsetX + heightPrime / 2, oy - Rp - 10, 0), 0, $"{heightPrime}");
|
||
}
|
||
}
|
||
}
|
||
|
||
private static void AddLinearDim(Database db, Transaction tr, BlockTableRecord btr,
|
||
Point3d pt1, Point3d pt2, Point3d dimLinePt, double rotationDeg, string textOverride)
|
||
{
|
||
try
|
||
{
|
||
double rotRad = rotationDeg * Math.PI / 180.0;
|
||
var dim = new RotatedDimension(rotRad, pt1, pt2, dimLinePt, textOverride, db.Dimstyle);
|
||
dim.ColorIndex = 4; // 青色
|
||
btr.AppendEntity(dim);
|
||
tr.AddNewlyCreatedDBObject(dim, true);
|
||
}
|
||
catch
|
||
{
|
||
// 忽略标注错误
|
||
}
|
||
}
|
||
|
||
private static void TryLoadLinetype(Database db, Transaction tr, string linetypeName)
|
||
{
|
||
try
|
||
{
|
||
var linetypeTbl = (LinetypeTable)tr.GetObject(db.LinetypeTableId, OpenMode.ForRead);
|
||
if (!linetypeTbl.Has(linetypeName))
|
||
{
|
||
try
|
||
{
|
||
db.LoadLineTypeFile(linetypeName, "acad.lin");
|
||
}
|
||
catch
|
||
{
|
||
// 忽略
|
||
}
|
||
}
|
||
}
|
||
catch
|
||
{
|
||
// 忽略
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|