1. //============================================================
    2. #region 其他绘图方法
    3. /// <summary>
    4. /// 创建筒体剖视图
    5. /// </summary>
    6. /// <param name="pt">内侧左上基准点</param>
    7. /// <param name="str">标注尺寸内容</param>
    8. /// <param name="tks">筒体厚度</param>
    9. /// <param name="isdn">true:标注内径;false:标注外径</param>
    10. public static void MakeShellSectionView(Point3d pt, string str, int tks, bool isdn = true)
    11. {
    12. Point2d p1 = new Point2d(pt.X, pt.Y);
    13. Point2d p8 = new Point2d(pt.X + 300, pt.Y - 150);
    14. Point2d p2 = new Point2d(pt.X + 300, pt.Y);
    15. Point2d p3 = new Point2d(pt.X, pt.Y - tks);
    16. Point2d p4 = new Point2d(pt.X + 300, pt.Y - tks);
    17. Point2d p5 = new Point2d(pt.X, p8.Y + tks);
    18. Point2d p6 = new Point2d(pt.X + 300, p8.Y + tks);
    19. Point2d p7 = new Point2d(pt.X, pt.Y - 150);
    20. db.AddRectToModelSpace(p1, p8);
    21. db.AddLineToModelSpace(p3, p4);
    22. db.AddLineToModelSpace(p5, p6);
    23. db.AddLineToModelSpace(new Point2d(p1.X - 10, p1.Y - 75), new Point2d(p8.X + 10, p8.Y + 75), 1, "ACAD_ISO04W100", 3);
    24. MakeHatch(3, 0, p1, p2, p3, p4, p5, p6, p7, p8);
    25. RotatedDim(new Point3d(p7.X + 200, p7.Y, 0), new Point3d(p5.X + 200, p5.Y, 0), new Point3d(p5.X + 200, p5.Y, 0), "<>", false, 5, 1, 0);
    26. if (isdn) RotatedDim(new Point3d(p3.X, p3.Y, 0), new Point3d(p5.X, p5.Y, 0), new Point3d(p1.X - 15, (p3.Y + p5.Y) / 2.0, 0), str, false, 5, 1, 0);
    27. else RotatedDim(new Point3d(p1.X, p1.Y, 0), new Point3d(p8.X, p8.Y, 0), new Point3d(p1.X - 15, (p1.Y + p8.Y) / 2.0, 0), str, false, 5, 1, 0);
    28. }
    29. /// <summary>
    30. /// 创建管道状填充
    31. /// </summary>
    32. /// <param name="sca">填充比例</param>
    33. /// <param name="ang">填充图形角度</param>
    34. /// <param name="p1">图形1左上点</param>
    35. /// <param name="p2">图形1左下点</param>
    36. /// <param name="p3">图形1右上点</param>
    37. /// <param name="p4">图形1右下点</param>
    38. /// <param name="p5">图形2左上点</param>
    39. /// <param name="p6">图形2左下点</param>
    40. /// <param name="p7">图形2右上点</param>
    41. /// <param name="p8">图形2右下点</param>
    42. public static void MakeHatch(double sca, double ang, Point2d p1, Point2d p2, Point2d p3, Point2d p4, Point2d p5, Point2d p6, Point2d p7, Point2d p8)
    43. {
    44. List<HatchLoopTypes> loops = new List<HatchLoopTypes>() { HatchLoopTypes.Outermost, HatchLoopTypes.Outermost };
    45. Polyline pl1 = new Polyline();
    46. pl1.AddVertexAt(0, p1, 0, 0, 0);
    47. pl1.AddVertexAt(1, p2, 0, 0, 0);
    48. pl1.AddVertexAt(2, p4, 0, 0, 0);
    49. pl1.AddVertexAt(3, p3, 0, 0, 0);
    50. pl1.Closed = true;
    51. Polyline pl2 = new Polyline();
    52. pl2.AddVertexAt(0, p5, 0, 0, 0);
    53. pl2.AddVertexAt(1, p6, 0, 0, 0);
    54. pl2.AddVertexAt(2, p8, 0, 0, 0);
    55. pl2.AddVertexAt(3, p7, 0, 0, 0);
    56. pl2.Closed = true;
    57. ObjectId[] delents = db.AddEntityToModelSpace(pl1, pl2);
    58. db.HatchEntity(loops, "ANSI31", sca, ang, delents[0], delents[1]);
    59. foreach (ObjectId id in delents) id.EraseEntity();
    60. }
    61. /// <summary>
    62. /// 创建筒体焊缝排版图
    63. /// </summary>
    64. /// <param name="pt">内侧左上基准点</param>
    65. /// <param name="si">筒体信息对象</param>
    66. /// <param name="scal">标注全局比例</param>
    67. public static void MakeWeldView(Point3d pt, ShellsInfo si, double scal, bool IsIn)
    68. {
    69. string atpy;
    70. int n = 1;
    71. Point3d pts0 = pt, pte0 = new Point3d(pts0.X + si.BarrelDn, pts0.Y, 0);
    72. Point3d pts1 = pts0, pte1 = pte0;
    73. Point3d pts2 = pts0, pte2 = pte0;
    74. db.AddLineToModelSpace(pts0, pte0);
    75. foreach (int hig in si.BarrelNode)
    76. {
    77. if (IsIn)
    78. {
    79. if (n <= 9) atpy = $"A10{n}";
    80. else if (n <= 99) atpy = $"A1{n}";
    81. else atpy = $"A{n}";
    82. }
    83. else
    84. {
    85. if (n <= 9) atpy = $"A20{n}";
    86. else if (n <= 99) atpy = $"A2{n}";
    87. else atpy = $"A{n}";
    88. }
    89. atpy = $"{atpy}-1 ~{atpy}-{si.Weldcout}";
    90. pts2 = new Point3d(pts2.X, pts2.Y - hig, 0);
    91. pte2 = new Point3d(pte2.X, pte2.Y - hig, 0);
    92. db.AddLineToModelSpace(pts2, pte2);
    93. Point3d inpt = new Point3d(pts1.X + (si.BarrelDn * 0.25 * ((2 * ((n - 1) % 2)) + 1)), pts2.Y + (hig / 2.0), 0);
    94. db.AddLineToModelSpace(new Point3d(inpt.X, pts1.Y, 0), new Point3d(inpt.X, pts2.Y, 0));
    95. db.AddTextToModelSpace(inpt, atpy, fonthig, TextHorizontalMode.TextCenter);
    96. db.AddTextToModelSpace(inpt, atpy, fonthig, TextHorizontalMode.TextCenter);
    97. if (n < si.BarrelNode.Count)
    98. {
    99. if (IsIn)
    100. {
    101. if (n <= 9) atpy = $"B10{n}";
    102. else if (n <= 99) atpy = $"B1{n}";
    103. else atpy = $"B{n}";
    104. }
    105. else
    106. {
    107. if (n <= 9) atpy = $"B20{n}";
    108. else if (n <= 99) atpy = $"B2{n}";
    109. else atpy = $"B{n}";
    110. }
    111. db.AddTextToModelSpace(new Point3d(pts2.X - fonthig, pts2.Y, 0), atpy, fonthig, TextHorizontalMode.TextRight, TextVerticalMode.TextVerticalMid);
    112. }
    113. n++;
    114. RotatedDim(pte1, pte2, new Point3d(pte1.X + (2 * fonthig), (pte1.Y + pte2.Y) / 2.0, 0), "<>", false, scal, 1, 0);
    115. pts1 = pts2;
    116. pte1 = pte2;
    117. }
    118. db.AddLineToModelSpace(pts0, pts2);
    119. db.AddLineToModelSpace(pte0, pte2);
    120. db.AddLineToModelSpace(new Point3d(pts0.X + (si.BarrelDn / 2.0), pts0.Y + fonthig / 2.0, 0), new Point3d(pts2.X + (si.BarrelDn / 2.0), pts2.Y - fonthig / 2.0, 0), 1, "ACAD_ISO04W100", 100);
    121. RotatedDim(pte0, pte1, new Point3d(pte0.X + (4 * fonthig), (pte0.Y + pte1.Y) / 2.0, 0), "<>", false, scal, 1, 0);
    122. RotatedDim(pts1, pte1, new Point3d((pts1.X + pte1.X) / 2.0, pts1.Y - (2 * fonthig), 0), "%%C<>(内径)", true, scal, 1, 0);
    123. ptssv = pts1;
    124. }
    125. /// <summary>
    126. /// 创建筒体示意图
    127. /// </summary>
    128. /// <param name="pt">内侧左上基准点</param>
    129. /// <param name="si">筒体信息对象</param>
    130. /// <param name="scal">标注全局比例</param>
    131. public static void MakeShellView(Point3d pt, ShellsInfo si, double scal)
    132. {
    133. Point2d p1 = new Point2d(pt.X, pt.Y), pdimt = new Point2d();
    134. db.AddLineToModelSpace(pt, new Point3d(pt.X, pt.Y - si.BarrelLen, 0));
    135. db.AddLineToModelSpace(new Point2d(pt.X + si.BarrelDn, pt.Y), new Point2d(pt.X + si.BarrelDn, pt.Y - si.BarrelLen));
    136. if (si.Barrel.Count > 1)
    137. {
    138. for (int i = 0; i < si.Barrel.Count; i++)
    139. {
    140. List<int> lst = si.Barrel[i];
    141. int tks = lst[1] * si.BarrelDn / 1000 * 2;
    142. p1 = new Point2d(p1.X - tks, p1.Y);
    143. Point2d p2 = new Point2d(p1.X, p1.Y - lst[0]);
    144. Point2d p3 = new Point2d(p1.X + tks, p1.Y);
    145. Point2d p4 = new Point2d(p3.X, p2.Y);
    146. Point2d p5 = new Point2d(p3.X + si.BarrelDn, p1.Y);
    147. Point2d p6 = new Point2d(p5.X, p5.Y - lst[0]);
    148. Point2d p7 = new Point2d(p5.X + tks, p5.Y);
    149. Point2d p8 = new Point2d(p7.X, p6.Y);
    150. if (i == 0)
    151. {
    152. pdimt = p7;
    153. db.AddLineToModelSpace(p1, p7);
    154. }
    155. db.AddLineToModelSpace(p1, p2);
    156. db.AddLineToModelSpace(p7, p8);
    157. if (i % 2 == 0) MakeHatch(100, 0, p1, p2, p3, p4, p5, p6, p7, p8);
    158. else MakeHatch(100, 90, p1, p2, p3, p4, p5, p6, p7, p8);
    159. if ((i + 1) < si.Barrel.Count && lst[1] < si.Barrel[i + 1][1])
    160. {
    161. tks = si.Barrel[i + 1][1] * si.BarrelDn / 1000 * 2;
    162. p2 = new Point2d(p3.X - tks, p2.Y);
    163. p8 = new Point2d(p5.X + tks, p6.Y);
    164. }
    165. db.AddLineToModelSpace(p2, p8);
    166. if (i == 0)
    167. {
    168. RotatedDim(p1, p3, new Point2d(p3.X, p3.Y + 0.5 * fonthig), "<>", true, scal, 1.0 / (si.BarrelDn / 1000 * 2), 0);
    169. }
    170. else
    171. {
    172. if (i + 1 == si.Barrel.Count)
    173. {
    174. Point2d pdimb = p8;
    175. db.AddLineToModelSpace(new Point2d(p3.X + (si.BarrelDn / 2.0), pdimt.Y + 750), new Point2d(p3.X + (si.BarrelDn / 2.0), pdimb.Y - 750), 1, "ACAD_ISO04W100", 100);
    176. RotatedDim(p2, p4, new Point2d(p4.X, p4.Y - 1.5 * fonthig), "<>", true, scal, 1.0 / (si.BarrelDn / 1000 * 2), 0);
    177. RotatedDim(p4, p6, new Point2d((p4.X + p6.X) / 2.0, p4.Y - 2.5 * fonthig), "%%c<>(内径)", true, scal, 1, 0);
    178. Point2d ptrdim = new Point2d(((pdimt.X + pdimb.X) / 2.0) + 3.5 * fonthig, (pdimt.Y + pdimb.Y) / 2.0);
    179. RotatedDim(pdimt, pdimb, ptrdim, "<>", false, scal, 1.0, 0);
    180. }
    181. else
    182. {
    183. RotatedDim(new Point2d(p1.X, p1.Y - (si.Barrel[i][0] / 2.0)), new Point2d(p3.X, p3.Y - (si.Barrel[i][0] / 2.0)), new Point2d(p3.X, p3.Y - (si.Barrel[i][0] / 2.0)), "<>", true, scal, 1.0 / (si.BarrelDn / 1000 * 2), 0);
    184. }
    185. }
    186. RotatedDim(p7, p8, new Point2d(pdimt.X + 1.8 * fonthig, (p7.Y + p8.Y) / 2.0), "<>", false, scal, 1.0, 0);
    187. p1 = p4;
    188. }
    189. }
    190. else
    191. {
    192. List<int> lst = si.Barrel[0];
    193. int tks = lst[1] * si.BarrelDn / 1000 * 2;
    194. p1 = new Point2d(p1.X - tks, p1.Y);
    195. Point2d p2 = new Point2d(p1.X, p1.Y - lst[0]);
    196. Point2d p3 = new Point2d(p1.X + tks, p1.Y);
    197. Point2d p4 = new Point2d(p3.X, p2.Y);
    198. Point2d p5 = new Point2d(p3.X + si.BarrelDn, p1.Y);
    199. Point2d p6 = new Point2d(p5.X, p5.Y - lst[0]);
    200. Point2d p7 = new Point2d(p5.X + tks, p5.Y);
    201. Point2d p8 = new Point2d(p7.X, p6.Y);
    202. db.AddLineToModelSpace(p1, p7);
    203. db.AddLineToModelSpace(p2, p8);
    204. db.AddLineToModelSpace(p1, p2);
    205. db.AddLineToModelSpace(p7, p8);
    206. MakeHatch(100, 0, p1, p2, p3, p4, p5, p6, p7, p8);
    207. RotatedDim(new Point2d(p1.X, p1.Y - (lst[0] / 2.0)), new Point2d(p3.X, p3.Y - (lst[0] / 2.0)), new Point2d(p3.X, p3.Y - (lst[0] / 2.0)), "<>", true, scal, 1.0 / (si.BarrelDn / 1000 * 2), 0);
    208. db.AddLineToModelSpace(new Point2d(p3.X + (si.BarrelDn / 2.0), p7.Y + 750), new Point2d(p3.X + (si.BarrelDn / 2.0), p8.Y - 750), 1, "ACAD_ISO04W100", 100);
    209. RotatedDim(p4, p6, new Point2d((p4.X + p6.X) / 2.0, p4.Y - (2.5 * fonthig)), "%%c<>(内径)", true, scal, 1, 0);
    210. Point2d ptrdim = new Point2d(p7.X + (2.5 * fonthig), (p7.Y + p8.Y) / 2.0);
    211. RotatedDim(p7, p8, ptrdim, "<>", false, scal, 1.0, 0);
    212. }
    213. }
    214. /// <summary>
    215. /// 承压环、底环板均分函数
    216. /// </summary>
    217. /// <param name="maxr">外圆半径</param>
    218. /// <param name="platewid">排版板宽</param>
    219. /// <param name="totalang">均分总角度</param>
    220. /// <param name="divnum">最优均分数量</param>
    221. /// <param name="divnum2">均分数量</param>
    222. private static void PlateDiv(double maxr, int platewid, double totalang, out int divnum, out int divnum2)
    223. {
    224. double widang = 2 * Math.Atan2(platewid / 2.0, Math.Sqrt(Math.Pow(maxr, 2) - Math.Pow(platewid / 2.0, 2)));
    225. divnum = (int)(totalang / widang);
    226. int divnum1 = divnum;
    227. double divang = totalang / divnum1;
    228. //计算拼接数量
    229. while (maxr * Math.Sin(divang / 2.0) > (platewid / 2.0))
    230. {
    231. divnum1++;
    232. divang = totalang / divnum1;
    233. }
    234. divnum2 = divnum1;
    235. divang = totalang / divnum2;
    236. while (maxr * Math.Sin(divang / 2.0) < (platewid / 2.0))
    237. {
    238. divnum2--;
    239. divang = totalang / divnum2;
    240. }
    241. //确定拼接数量
    242. divnum = divnum1 > divnum ? divnum1 : divnum2;
    243. }
    244. /// <summary>
    245. /// 创建圆环均分及文字
    246. /// </summary>
    247. /// <param name="maxr">圆环最大直径</param>
    248. /// <param name="minr">圆环最小直径</param>
    249. /// <param name="cen">圆环圆心点</param>
    250. /// <param name="divnum">圆环等分数量</param>
    251. /// <param name="divang">圆环等分后,每分角度(弧度)</param>
    252. /// <param name="atpy">焊缝编号,A10X,B20X</param>
    253. private static void MakeRingDivWeldText(double maxr, double minr, Point3d cen, int divnum, double divang, string atpy)
    254. {
    255. for (int i = 0; i < divnum; i++)
    256. {
    257. double lang = (divang / 2.0) + (i * divang);
    258. db.AddLineToModelSpace(cen.PolarPtOfDegree(lang, minr), cen.PolarPtOfDegree(lang, maxr));
    259. string str = $"{atpy}-{i + 1}";
    260. TextHorizontalMode thm;
    261. if (Math.Abs(lang - (Math.PI * 0.5)) < (0.5 * divang) || Math.Abs(lang - (Math.PI * 1.5)) < (0.5 * divang) || lang == Math.PI * 0.5 || lang == Math.PI * 1.5)
    262. thm = TextHorizontalMode.TextCenter;
    263. else if (lang > (Math.PI * 0.5) && lang < (Math.PI * 1.5)) thm = TextHorizontalMode.TextRight;
    264. else thm = TextHorizontalMode.TextLeft;
    265. Point3d tpt = cen.PolarPtOfDegree(lang, maxr + fonthig);
    266. bool angpart = (lang > 0 && lang <= (Math.PI * 0.5)) || (lang > Math.PI && lang <= (Math.PI * 1.5));
    267. double tang = (divang / 2.0) + (i * divang), bigang, smlang;
    268. if (lang <= Math.PI * 0.5)
    269. {
    270. smlang = 0;
    271. bigang = Math.PI * 0.5;
    272. }
    273. else if (lang <= Math.PI)
    274. {
    275. smlang = Math.PI * 0.5;
    276. bigang = Math.PI;
    277. }
    278. else if (lang <= Math.PI * 1.5)
    279. {
    280. smlang = Math.PI;
    281. bigang = Math.PI * 1.5;
    282. }
    283. else
    284. {
    285. smlang = Math.PI * 1.5;
    286. bigang = Math.PI * 2;
    287. }
    288. Point3d prpt1 = tpt;
    289. int n = angpart ? -1 : 1;
    290. Point3d prpt2 = cen.PolarPtOfDegree((divang / 2.0) + ((i + n) * divang), maxr + fonthig);
    291. while (Math.Abs(prpt1.Y - prpt2.Y) <= (1.1 * fonthig) && ((divang / 2.0) + ((i + n) * divang)) > smlang && ((divang / 2.0) + ((i + n) * divang)) <= bigang)
    292. {
    293. if (lang > 0 && lang < Math.PI)
    294. {
    295. tpt = tpt.PolarPtOfDegree(lang, Math.Abs((prpt2.Y + (1.1 * fonthig) - prpt1.Y) / Math.Sin(tang)));
    296. }
    297. else
    298. {
    299. tpt = tpt.PolarPtOfDegree(lang, Math.Abs((prpt2.Y - prpt1.Y - (1.1 * fonthig)) / Math.Sin(tang)));
    300. }
    301. prpt1 = prpt2;
    302. if (angpart) n--;
    303. else n++;
    304. prpt2 = cen.PolarPtOfDegree((divang / 2.0) + ((i + n) * divang), maxr + fonthig);
    305. }
    306. if (pted2.Y > tpt.Y) pte0 = pted2 = new Point3d(pted2.X, tpt.Y - (0.5 * fonthig), 0);
    307. db.AddTextToModelSpace(tpt, str, fonthig, thm, TextVerticalMode.TextVerticalMid);
    308. }
    309. }
    310. #endregion
    311. //============================================================