public interface spa {
CustomBendAllowance GetCustomBendAllowance();
double BendAngle { get;}
double BendRadius { get; set; }
bool UseDefaultBendAllowance { get; set; }
void SetCustomBendAllowance(CustomBendAllowance allowance);
}
public class EdgeFlangeFeatureDataAdapter : spa//适配器
{
public EdgeFlangeFeatureData _edgeFlange;
public EdgeFlangeFeatureDataAdapter(object edgeFlange)
{
_edgeFlange = (EdgeFlangeFeatureData)edgeFlange ?? throw new ArgumentNullException(nameof(edgeFlange));
}
public CustomBendAllowance GetCustomBendAllowance()
{
// 适配EdgeFlangeFeatureData中获取折弯系数的方法,假设名为GetCustomFlangeBendAllowance
return _edgeFlange.GetCustomBendAllowance();
}
public double BendAngle
{
// 假设EdgeFlangeFeatureData中存储折弯角度的属性名为FlangeBendAngle
get => _edgeFlange.BendAngle;
}
public double BendRadius
{
// 同样,假设存储折弯半径的属性名为FlangeBendRadius
get => _edgeFlange.BendRadius ; // 根据需要转换单位
set => _edgeFlange.BendRadius = value;
}
public bool UseDefaultBendAllowance
{
get => _edgeFlange.UseDefaultBendAllowance;
set => _edgeFlange.UseDefaultBendAllowance = value;
}
public void SetCustomBendAllowance(CustomBendAllowance allowance)
{
// 适配设置折弯系数的方法,假设名为SetCustomFlangeBendAllowance
_edgeFlange.SetCustomBendAllowance(allowance);
}
}
public class IOneBendFeatureDataAdapter : spa
{
public IOneBendFeatureData _edgeFlange;
public IOneBendFeatureDataAdapter( object edgeFlange)
{
_edgeFlange = (IOneBendFeatureData)edgeFlange ?? throw new ArgumentNullException(nameof(edgeFlange));
}
public CustomBendAllowance GetCustomBendAllowance()
{
// 适配IOneBendFeatureData中获取折弯系数的方法,假设名为GetCustomFlangeBendAllowance
return _edgeFlange.GetCustomBendAllowance();
}
public double BendAngle
{
// 假设IOneBendFeatureData中存储折弯角度的属性名为FlangeBendAngle
get => _edgeFlange.BendAngle;
}
public double BendRadius
{
// 同样,假设存储折弯半径的属性名为FlangeBendRadius
get => _edgeFlange.BendRadius; // 根据需要转换单位
set => _edgeFlange.BendRadius = value;
}
public bool UseDefaultBendAllowance
{
get => _edgeFlange.UseDefaultBendAllowance;
set => _edgeFlange.UseDefaultBendAllowance = value;
}
public void SetCustomBendAllowance(CustomBendAllowance allowance)
{
// 适配设置折弯系数的方法,假设名为SetCustomFlangeBendAllowance
_edgeFlange.SetCustomBendAllowance(allowance);
}
}
public class SketchedBendFeatureDataAdapter : spa
{
public SketchedBendFeatureData _edgeFlange;
public SketchedBendFeatureDataAdapter(object edgeFlange)
{
_edgeFlange = (SketchedBendFeatureData)edgeFlange ?? throw new ArgumentNullException(nameof(edgeFlange));
}
public CustomBendAllowance GetCustomBendAllowance()
{
// 适配IOneBendFeatureData中获取折弯系数的方法,假设名为GetCustomFlangeBendAllowance
return _edgeFlange.GetCustomBendAllowance();
}
public double BendAngle
{
// 假设IOneBendFeatureData中存储折弯角度的属性名为FlangeBendAngle
get => _edgeFlange.BendAngle;
}
public double BendRadius
{
// 同样,假设存储折弯半径的属性名为FlangeBendRadius
get => _edgeFlange.BendRadius; // 根据需要转换单位
set => _edgeFlange.BendRadius = value;
}
public bool UseDefaultBendAllowance
{
get => _edgeFlange.UseDefaultBendAllowance;
set => _edgeFlange.UseDefaultBendAllowance = value;
}
public void SetCustomBendAllowance(CustomBendAllowance allowance)
{
// 适配设置折弯系数的方法,假设名为SetCustomFlangeBendAllowance
_edgeFlange.SetCustomBendAllowance(allowance);
}
}
public bool 特征读取()
{
var swModel = (ModelDoc2)this.sldWorks.ActiveDoc;
PartDoc swPart = (PartDoc)swModel;
object[] vBodies = (object[])swPart.GetBodies2((int)swBodyType_e.swSolidBody, false);
if (vBodies.Count() > 1) {
假的子件=true;
聊天记录+=("要标角标");
}
Feature swFeature = (Feature)swModel.FirstFeature();
double thickness = 0.0;
this.折弯次数1类 =0;
this.折弯次数2类 =0;
this.折弯次数3类 = 0;
double 边界框长 = 0;
double 边界框宽 = 0;
double 折弯补偿 = 0;
double 默认折弯半径 = 0;
string 非90度收集 = "";
int 段差收集 = 0;
/整理和实现
while (swFeature != null)
{
if (swFeature.GetTypeName2() == "SheetMetal")
{
SheetMetalFeatureData swSheetMetalData = (SheetMetalFeatureData)swFeature.GetDefinition();
swSheetMetalData.SetUseGaugeTable(false, "");
CustomBendAllowance swCustBend = default(CustomBendAllowance);
swCustBend = swSheetMetalData.GetCustomBendAllowance();
bool bRet = swSheetMetalData.AccessSelections(swModel, null);
if (Math.Round(swSheetMetalData.BendRadius * 1000, 3) == 0)
{
swSheetMetalData.BendRadius = 0.01 / 1000;
}
默认折弯半径 = Math.Round(swSheetMetalData.BendRadius * 1000, 3);
thickness = swSheetMetalData.Thickness;
thickness *= 1000.0;
this.厚度mm = Math.Round(thickness, 1);
var ConfigNames = (string[])swModel.GetConfigurationNames();
var 物料材质info = swModel.GetCustomInfoValue(ConfigNames[0], "材质");
double 板厚 = 0;
int 空格位置 = 物料材质info.IndexOf(" ");
if (空格位置 != -1)
{
Match 板厚match = Regex.Match(物料材质info.Substring(空格位置), @"\d{1,2}(\.\d{1,2})?");
double.TryParse(板厚match.Value, out 板厚);
if (this.厚度mm == 0) { Debug.WriteLine("厚度=0"); }
if (板厚 != this.厚度mm && 板厚 != 0)
{
Debug.WriteLine($"{this.厚度mm}=>{板厚},板厚match.Value={板厚match.Value},物料材质info={物料材质info}");
this.聊天记录 += $"********板厚不同\n{this.厚度mm}=>{板厚}\n";
this.厚度mm = Math.Round(板厚, 1);
thickness = 板厚; swSheetMetalData.Thickness = thickness / 1000;
swSheetMetalData.SetOverrideDefaultParameter2(0, true);
}
}
折弯补偿 = 常量.折弯补偿映射字典[thickness];
swCustBend.Type = 4;
swCustBend.BendDeduction = (2 * this.厚度mm - 折弯补偿) / 1000;
//swCustBend.Type = 2;
//swCustBend.KFactor = ((2 / Math.PI) * (2 * 默认折弯半径 + 折弯补偿) - 默认折弯半径) / this.厚度mm;
swSheetMetalData.SetOverrideDefaultParameter2(1, true);//k因子和板厚
swSheetMetalData.SetCustomBendAllowance(swCustBend);
bool bRet2 = swFeature.ModifyDefinition(swSheetMetalData, swModel, null);
swModel.EditRebuild3();
}
else if (swFeature.GetTypeName2() == "SMBaseFlange")
{
//BaseFlangeFeatureData
BaseFlangeFeatureData swBaseFlange = default(BaseFlangeFeatureData);
swBaseFlange = (BaseFlangeFeatureData)swFeature.GetDefinition();
Feature swBaseSubFeature = (Feature)swFeature.GetFirstSubFeature();
while ((swBaseSubFeature != null))
{
if (swBaseSubFeature.GetTypeName() == "SketchBend")
{
var OneBendFeature = (IOneBendFeatureData)swBaseSubFeature.GetDefinition();
Debug.WriteLine("bendname:" + swBaseSubFeature.Name);
spa Bend = new IOneBendFeatureDataAdapter(OneBendFeature);
if (设折弯系数(ref Bend))
{
swBaseSubFeature.ModifyDefinition(OneBendFeature, swModel, null);
};
}
swBaseSubFeature = (Feature)swBaseSubFeature.GetNextSubFeature();
}
}
else if (swFeature.GetTypeName2() == "EdgeFlange")
{
var swEdgeFlange = (EdgeFlangeFeatureData)swFeature.GetDefinition();
//swEdgeFlange.UsePositionTrimSideBends = true;
var swCustBend = swEdgeFlange.GetCustomBendAllowance();
bool 要更新 = false, 设折弯 = false;
spa Bend = new EdgeFlangeFeatureDataAdapter(swEdgeFlange);
if (swEdgeFlange.GapDistance * 1000 > 0.5)
{
swEdgeFlange.GapDistance = 0.5 / 1000;
要更新 = true;
聊天记录 += $"{swFeature.Name} 有大缝隙 需要检查***\n";
}
double 伸长量 = swEdgeFlange.OffsetDistance;
if (伸长量 * 1000 <= 5)
{
swEdgeFlange.UseDefaultBendAllowance = false;
//swCustBend.Type = (int)swBendAllowanceTypes_e.swBendAllowanceKFactor;
//swCustBend.KFactor =( 2*(this.厚度mm-折弯补偿)/Math.PI- swEdgeFlange.BendRadius*1000)/ this.厚度mm;
swCustBend.Type = (int)swBendAllowanceTypes_e.swBendAllowanceDeduction;
swCustBend.BendDeduction = (this.厚度mm + 折弯补偿) / 1000;
Console.WriteLine("this.厚度mm=" + this.厚度mm + ",折弯补偿=" + 折弯补偿 + ",折弯半径" + swEdgeFlange.BendRadius * 1000);
swEdgeFlange.SetCustomBendAllowance(swCustBend);
段差收集++;
要更新 = true;
}
else { 设折弯 = 设折弯系数(ref Bend); }
if (设折弯 || 要更新)
{
swFeature.ModifyDefinition(swEdgeFlange, swModel, null);
};
}
else if (swFeature.GetTypeName2() == "FlatPattern")
{
FlatPatternFeatureData swFlatPatt = default(FlatPatternFeatureData);
swFlatPatt = (FlatPatternFeatureData)swFeature.GetDefinition();
this.展开用featurename = swFeature.Name;
swFeature.SetSuppression((int)swFeatureSuppressionAction_e.swUnSuppressDependent);
swFeature.SetSuppression((int)swFeatureSuppressionAction_e.swUnSuppressFeature);
Feature swBaseSubFeature = (Feature)swFeature.GetFirstSubFeature();
List<double> 边界框 = new List<double>();
while ((swBaseSubFeature != null))
{
//展平-<边线折弯4>1 [UiBend] 折弯-线2 [ProfileFeature]
// Debug.Print(swBaseSubFeature.Name + " [" + swBaseSubFeature.GetTypeName() + "]");
swBaseSubFeature.SetSuppression((int)swFeatureSuppressionAction_e.swUnSuppressFeature);
if (swBaseSubFeature.GetTypeName() == "ProfileFeature")
{
var sketchSpc = (Sketch)swBaseSubFeature.GetSpecificFeature2();
object[] vSketchSeg = (object[])sketchSpc.GetSketchSegments();
List<(double[], double[])> 边线集 = new List<(double[], double[])>();
if (vSketchSeg != null)
{
for (int j = 0; j < vSketchSeg.Length; j++)
{
SketchSegment swSketchSeg = (SketchSegment)vSketchSeg[j];
//如果直线不是折弯线,说明是边界框
if (swSketchSeg.IsBendLine() == false)
{
边界框.Add(Math.Round(swSketchSeg.GetLength() * 1000, 2));
}
else if (swSketchSeg.IsBendLine() == true)
{
Curve curve = (Curve)swSketchSeg.GetCurve();
double length = Math.Round(swSketchSeg.GetLength() * 1000, 1);
var linep = (double[])curve.LineParams;
double[] startp = new double[] { Math.Round(linep[0] * 1000, 1),
Math.Round(linep[1] * 1000, 1)};
double[] endp = new double[]
{ Math.Round(linep[0] * 1000, 1)+ linep[3]* length,
Math.Round(linep[1] * 1000, 1)+ linep[4]* length};
边线集.Add((startp, endp));
double 折弯长度 = swSketchSeg.GetLength() * 1000;
if (折弯长度 < 300) this.折弯次数1类++;
if (300 <= 折弯长度 && 折弯长度 < 500) this.折弯次数2类++;
if (500 <= 折弯长度) this.折弯次数3类++;
}
}
}
int 要做闭合角图纸边线要标焊接 = 0;
for (int ii = 0; ii < 边线集.Count; ii++)
{
(double[] startp, double[] endp) = 边线集[ii];
for (int ij = ii + 1; ij < 边线集.Count; ij++)
{
if (ij == ii) continue;
(double[] startp2, double[] endp2) = 边线集[ij];
if ((Math.Abs(startp2[0] - startp[0]) + Math.Abs(startp2[1] - startp[1])) < 5)
{
要做闭合角图纸边线要标焊接++;
}
else if ((Math.Abs(startp2[0] - endp[0]) + Math.Abs(startp2[1] - endp[1])) < 5)
{
要做闭合角图纸边线要标焊接++;
}
else if ((Math.Abs(startp[0] - endp2[0]) + Math.Abs(startp[1] - endp2[1])) < 5)
{
要做闭合角图纸边线要标焊接++;
}
else if ((Math.Abs(endp2[0] - endp[0]) + Math.Abs(endp2[1] - endp[1])) < 5)
{
要做闭合角图纸边线要标焊接++;
}
}
}
if (要做闭合角图纸边线要标焊接 - 段差收集 > 0) this.聊天记录 += ("要做闭合角图纸边线要标焊接" + "\n");
Console.WriteLine("接近点数=" + (要做闭合角图纸边线要标焊接 - 段差收集) + ",段差收集=" + 段差收集);
}
if (swBaseSubFeature.GetTypeName() == "UiBend")
{
}
swBaseSubFeature = (Feature)swBaseSubFeature.GetNextSubFeature();
}
if (边界框.Count > 1)
{
边界框 = 边界框.GroupBy(x => x).Select(x => { Console.WriteLine("key:" + x.Key); return x.Key; }).ToList();
if (边界框.Count > 1)
{
边界框长 = 边界框[0]; 边界框宽 = 边界框[1];
}
else { 边界框长 = 边界框宽 = 边界框[0]; }
}
swFeature.SetSuppression((int)swFeatureSuppressionAction_e.swSuppressFeature);
}
else if (swFeature.GetTypeName2() == "ICE")
{
Console.WriteLine($"特征名称是{swFeature.Name}"
+ "ice特征名称为:" + swFeature.GetTypeName());
IExtrudeFeatureData2 swFlatPatt = (IExtrudeFeatureData2)swFeature.GetDefinition();
if (swFlatPatt.GetDepth(true) != 0 && swFlatPatt.GetDepth(true) * 1000 < thickness * 0.7)
{
this.聊天记录 += ("存在防涂面:" + swFeature.Name + ",1deep:" + swFlatPatt.GetDepth(true) * 1000 + "\n");
}
}
else if (swFeature.GetTypeName2() == "SolidToSheetMetal")
{
Feature swBaseSubFeature = (Feature)swFeature.GetFirstSubFeature();
while ((swBaseSubFeature != null))
{
Debug.WriteLine("SolidToSheetMetal:" + swBaseSubFeature.Name + " [" + swBaseSubFeature.GetTypeName() + "]");
if (swBaseSubFeature.GetTypeName() == "OneBend")
{
var OneBendFeature = (OneBendFeatureData)swBaseSubFeature.GetDefinition();
spa Bend = new IOneBendFeatureDataAdapter(OneBendFeature);
if (设折弯系数(ref Bend))
{
swBaseSubFeature.ModifyDefinition(OneBendFeature, swModel, null);
};
}
//需要解决转换钣金段差因子问题 offset
swBaseSubFeature = (Feature)swBaseSubFeature.GetNextSubFeature();
}
}
else if (swFeature.GetTypeName2() == "Hem")
{
HemFeatureData swHem = default(HemFeatureData);
CustomBendAllowance swCustBend = default(CustomBendAllowance);
swHem = (HemFeatureData)swFeature.GetDefinition();
swCustBend = swHem.GetCustomBendAllowance();
//非90度收集 = 非90度收集 + ($"{swFeature.Name},折弯角度为{180}度\n折弯系数改为k{swCustBend.KFactor.ToString("F1")}" + "\n");
swCustBend.Type = 2;
swCustBend.KFactor = 0.5;
swHem.UseDefaultBendAllowance = false;
swHem.SetCustomBendAllowance(swCustBend);
swFeature.ModifyDefinition(swHem, swModel, null);
}
else if (swFeature.GetTypeName2() == "SMMiteredFlange")
{
MiterFlangeFeatureData swBaseFlange = default(MiterFlangeFeatureData);
swBaseFlange = (MiterFlangeFeatureData)swFeature.GetDefinition();
Feature swBaseSubFeature = (Feature)swFeature.GetFirstSubFeature();
while ((swBaseSubFeature != null))
{
Debug.Print(swBaseSubFeature.Name + " [" + swBaseSubFeature.GetTypeName() + "]");
if (swBaseSubFeature.GetTypeName() == "SketchBend")
{
var OneBendFeature = (OneBendFeatureData)swBaseSubFeature.GetDefinition();
spa Bend = new IOneBendFeatureDataAdapter(OneBendFeature);
if (设折弯系数(ref Bend))
{
swBaseSubFeature.ModifyDefinition(OneBendFeature, swModel, null);
};
}
swBaseSubFeature = (Feature)swBaseSubFeature.GetNextSubFeature();
}
}
else if (swFeature.GetTypeName2() == "LPattern")
{
Feature swBaseSubFeature = (Feature)swFeature.GetFirstSubFeature();
while ((swBaseSubFeature != null))
{
Debug.Print(swBaseSubFeature.Name + " [" + swBaseSubFeature.GetTypeName() + "]");
if (swBaseSubFeature.GetTypeName() == "OneBend")
{
var OneBendFeature = (OneBendFeatureData)swBaseSubFeature.GetDefinition();
spa Bend = new IOneBendFeatureDataAdapter(OneBendFeature);
if (设折弯系数(ref Bend))
{
swBaseSubFeature.ModifyDefinition(OneBendFeature, swModel, null);
};
}
swBaseSubFeature = (Feature)swBaseSubFeature.GetNextSubFeature();
}
}
else if (swFeature.GetTypeName2() == "SM3dBend")
{
//SketchedBendFeatureData
var OneBendFeature = (SketchedBendFeatureData)swFeature.GetDefinition();
spa Bend = new SketchedBendFeatureDataAdapter(OneBendFeature);
if (设折弯系数(ref Bend))
{
swFeature.ModifyDefinition(OneBendFeature, swModel, null);
};
}
else if (swFeature.GetTypeName2() == "Jog")//DUANCHA
{
JogFeatureData Jog = default(JogFeatureData);
CustomBendAllowance swCustBend = default(CustomBendAllowance);
Jog = (JogFeatureData)swFeature.GetDefinition();
swCustBend = Jog.GetCustomBendAllowance();
Jog.UseDefaultBendAllowance = false;
swCustBend.Type = 4;
swCustBend.BendDeduction = this.厚度mm * 3 / 2 / 1000;
Jog.SetCustomBendAllowance(swCustBend);
bool bRet2 = swFeature.ModifyDefinition(Jog, swModel, null);
}
else if (swFeature.GetTypeName2() == "CornerFeat")//DUANCHA
{
ClosedCornerFeatureData swCloseCorner = default(ClosedCornerFeatureData);
swCloseCorner = (ClosedCornerFeatureData)swFeature.GetDefinition();
if (swCloseCorner.GapDistance * 1000 < 0.5)
swCloseCorner.GapDistance = 0.5 / 1000;
swFeature.ModifyDefinition(swCloseCorner, swModel, null);
}
else {
Debug.WriteLine($"特征种类是{swFeature.GetTypeName2()},特征名称是{swFeature.Name}");
}
swFeature = (Feature)swFeature.GetNextFeature();
}
bool 设折弯系数(ref 子方法.spa Bend) {
double 折弯角度, 折弯半径;
bool 要更新=false;
var swCustBend = Bend.GetCustomBendAllowance();
折弯角度 = Bend.BendAngle;
折弯半径 = Bend.BendRadius * 1000;
if (Math.Round(折弯半径, 3) == 0)
{
Bend.BendRadius = 0.01 / 1000;
要更新 = true;
}
double 角度转换2 = 折弯角度 * 180.0 / Math.PI;//弧度制 转角度制
double 折弯相差值 = 折弯半径 * Math.Tan(折弯角度 / 2) * 2;
if (Math.Abs(角度转换2 - 90) < 0.5)
{
if (Bend.UseDefaultBendAllowance == false)
{
this.聊天记录 += ($"{swFeature.Name} 90度法兰有非默认折弯系数:" +
$"{(swCustBend.Type==2?"k因子 "+swCustBend.KFactor.ToString():("扣除 "+swCustBend.BendDeduction*1000+"mm"))}\n");
swCustBend.Type = 2;
swCustBend.KFactor = ((2 / Math.PI) * (2 * 折弯半径 + 折弯补偿) - 折弯半径) / this.厚度mm;
Bend.SetCustomBendAllowance(swCustBend);
要更新 = true;
}
}
else if (Math.Abs(角度转换2 - 90) > 0.5) {
Bend.UseDefaultBendAllowance = false;
swCustBend.Type = 2;
角度转换2 = 角度转换2 > 90 ? 180 - 角度转换2 : 角度转换2;
swCustBend.KFactor = ((折弯补偿 + 折弯相差值 * 90 / 角度转换2) * 2 / Math.PI - 折弯半径) / thickness;
非90度收集 = 非90度收集 + ($"{swFeature.Name},折弯角度为{(角度转换2).ToString("F1")}\n折弯系数改为k{swCustBend.KFactor.ToString("F3")}" + "\n");
Bend.SetCustomBendAllowance(swCustBend);
要更新 = true;
}
return 要更新;
}
if (段差收集 != 0) this.聊天记录 += ($"有{段差收集}处段差,工程图要标段差\n");
if (边界框长==0) this.聊天记录 += ($"零件展不开\n");
if ((边界框长 > 1400&& 边界框宽 > 600) || (边界框宽 > 1400&& 边界框长 > 600)) {
this.校平工艺 = true;
}
this.长度mm = 边界框长;
this.宽度mm = 边界框宽;
if (非90度收集 != "") this.聊天记录 += ("工程图要标非90尺寸\n," + 非90度收集 + "\n");
if (this.折弯次数1类!=0 || this.折弯次数2类!=0 || this.折弯次数3类!=0) this.折弯工艺 = true;
if (长度mm > 0) this.下料工艺 = true;
return true;
}
c# solidworks feature修改
最新推荐文章于 2024-09-23 22:10:12 发布