using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
namespace BeamSlabPlugin
{
// 参数类定义
public class BeamSlabParameters
{
public BeamSideSecondaryParameters BeamSideSecondary { get; set; } = new BeamSideSecondaryParameters();
public BeamSidePrimaryParameters BeamSidePrimary { get; set; } = new BeamSidePrimaryParameters();
public BeamBoltParameters BeamBolt { get; set; } = new BeamBoltParameters();
public BeamBottomSecondaryParameters BeamBottomSecondary { get; set; } = new BeamBottomSecondaryParameters();
public BeamBottomPrimaryParameters BeamBottomPrimary { get; set; } = new BeamBottomPrimaryParameters();
public SlabParameters Slab { get; set; } = new SlabParameters();
public double DefaultSlabThickness { get; set; } = 120;
public double FormworkThickness { get; set; } = 15;
}
public class BeamSideSecondaryParameters
{
public bool Enabled { get; set; } = true;
public string Direction { get; set; } = "Vertical";
public string Material { get; set; } = "木方";
public double Height { get; set; } = 90;
public double Width { get; set; } = 40;
public double Spacing { get; set; } = 200;
}
public class BeamSidePrimaryParameters
{
public bool Enabled { get; set; } = true;
public string Direction { get; set; } = "Horizontal";
public string Material { get; set; } = "钢管";
public double Height { get; set; } = 100;
public double Width { get; set; } = 100;
public double Diameter { get; set; } = 48;
}
public class BeamBoltParameters
{
public bool Enabled { get; set; } = true;
public double BottomOffset { get; set; } = 150;
public double TopOffset { get; set; } = 150;
public double MaxSpacing { get; set; } = 500;
}
public class BeamBottomSecondaryParameters
{
public bool Enabled { get; set; } = true;
public string Direction { get; set; } = "Longitudinal";
public string Material { get; set; } = "木方";
public double Height { get; set; } = 90;
public double Width { get; set; } = 40;
public double Spacing { get; set; } = 200;
}
public class BeamBottomPrimaryParameters
{
public bool Enabled { get; set; } = true;
public string Material { get; set; } = "钢管";
public double Height { get; set; } = 100;
public double Width { get; set; } = 100;
}
public class SlabParameters
{
public bool SecondaryEnabled { get; set; } = true;
public string SecondaryDirection { get; set; } = "Longitudinal";
public string SecondaryMaterial { get; set; } = "木方";
public double SecondaryHeight { get; set; } = 90;
public double SecondaryWidth { get; set; } = 40;
public double SecondarySpacing { get; set; } = 200;
public bool PrimaryEnabled { get; set; } = true;
public string PrimaryMaterial { get; set; } = "钢管";
public double PrimaryHeight { get; set; } = 100;
public double PrimaryWidth { get; set; } = 100;
}
// 参数窗体类
public class ParameterForm : Form
{
public BeamSlabParameters Parameters { get; private set; }
// 梁侧次龙骨控件
private RadioButton radBeamSideSecondaryYes;
private RadioButton radBeamSideSecondaryNo;
private RadioButton radBeamSideSecondaryHorizontal;
private RadioButton radBeamSideSecondaryVertical;
private ComboBox cmbBeamSideSecondaryMaterial;
private TextBox txtBeamSideSecondaryHeight;
private TextBox txtBeamSideSecondaryWidth;
private TextBox txtBeamSideSecondarySpacing;
// 梁侧主龙骨控件
private RadioButton radBeamSidePrimaryYes;
private RadioButton radBeamSidePrimaryNo;
private RadioButton radBeamSidePrimaryHorizontal;
private RadioButton radBeamSidePrimaryVertical;
private ComboBox cmbBeamSidePrimaryMaterial;
private TextBox txtBeamSidePrimaryHeight;
private TextBox txtBeamSidePrimaryWidth;
private TextBox txtBeamSidePrimaryDiameter;
// 梁对拉螺栓设置控件
private TextBox txtBeamBoltBottomOffset;
private TextBox txtBeamBoltTopOffset;
private TextBox txtBeamBoltMaxSpacing;
// 梁底次龙骨控件
private RadioButton radBeamBottomSecondaryYes;
private RadioButton radBeamBottomSecondaryNo;
private RadioButton radBeamBottomSecondaryHorizontal;
private RadioButton radBeamBottomSecondaryLongitudinal;
private ComboBox cmbBeamBottomSecondaryMaterial;
private TextBox txtBeamBottomSecondaryHeight;
private TextBox txtBeamBottomSecondaryWidth;
private TextBox txtBeamBottomSecondarySpacing;
// 梁底主龙骨控件
private RadioButton radBeamBottomPrimaryYes;
private RadioButton radBeamBottomPrimaryNo;
private ComboBox cmbBeamBottomPrimaryMaterial;
private TextBox txtBeamBottomPrimaryHeight;
private TextBox txtBeamBottomPrimaryWidth;
// 板龙骨设置控件
private TextBox txtDefaultSlabThickness;
private TextBox txtFormworkThickness;
private RadioButton radSlabSecondaryYes;
private RadioButton radSlabSecondaryNo;
private RadioButton radSlabSecondaryHorizontal;
private RadioButton radSlabSecondaryLongitudinal;
private ComboBox cmbSlabSecondaryMaterial;
private TextBox txtSlabSecondaryHeight;
private TextBox txtSlabSecondaryWidth;
private TextBox txtSlabSecondarySpacing;
private RadioButton radSlabPrimaryYes;
private RadioButton radSlabPrimaryNo;
private ComboBox cmbSlabPrimaryMaterial;
private TextBox txtSlabPrimaryHeight;
private TextBox txtSlabPrimaryWidth;
private Button btnOK;
private Button btnCancel;
public ParameterForm()
{
Parameters = new BeamSlabParameters();
InitializeComponent();
SetupEventHandlers();
}
private void InitializeComponent()
{
this.Text = "梁板剖面绘制参数设置";
this.Size = new Size(800, 600); // 增加窗体大小以容纳所有控件
this.StartPosition = FormStartPosition.CenterScreen;
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
// 创建选项卡控件
TabControl tabControl = new TabControl();
tabControl.Dock = DockStyle.Fill;
tabControl.TabPages.Add("梁龙骨设置");
tabControl.TabPages.Add("板龙骨设置");
// 梁龙骨设置页面
TabPage beamPage = tabControl.TabPages[0];
beamPage.AutoScroll = true; // 启用滚动条
InitializeBeamPage(beamPage);
// 板龙骨设置页面
TabPage slabPage = tabControl.TabPages[1];
slabPage.AutoScroll = true; // 启用滚动条
InitializeSlabPage(slabPage);
// 创建底部面板放置按钮
Panel bottomPanel = new Panel();
bottomPanel.Dock = DockStyle.Bottom;
bottomPanel.Height = 50;
bottomPanel.BackColor = SystemColors.Control;
// 确定和取消按钮
btnOK = new Button();
btnOK.Text = "开始绘制";
btnOK.DialogResult = DialogResult.OK;
btnOK.Size = new Size(100, 30);
btnOK.Location = new Point(this.Width - 220, 10);
btnCancel = new Button();
btnCancel.Text = "取消";
btnCancel.DialogResult = DialogResult.Cancel;
btnCancel.Size = new Size(100, 30);
btnCancel.Location = new Point(this.Width - 110, 10);
bottomPanel.Controls.Add(btnOK);
bottomPanel.Controls.Add(btnCancel);
this.Controls.Add(tabControl);
this.Controls.Add(bottomPanel);
}
private void InitializeBeamPage(TabPage page)
{
int yPos = 15;
int labelWidth = 120;
int controlSpacing = 10;
int column1 = 20;
int column2 = column1 + labelWidth + controlSpacing;
int column3 = column2 + 100;
int column4 = column3 + 100;
int column5 = column4 + 100;
// 标题
Label lblTitle = new Label();
lblTitle.Text = "梁龙骨设置参数";
lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 10, System.Drawing.FontStyle.Bold);
lblTitle.Location = new Point(column1, yPos);
lblTitle.Size = new Size(250, 20);
page.Controls.Add(lblTitle);
yPos += 30;
// 绘制梁侧次龙骨
Label lblBeamSideSecondary = new Label();
lblBeamSideSecondary.Text = "绘制梁侧次龙骨:";
lblBeamSideSecondary.Location = new Point(column1, yPos);
lblBeamSideSecondary.Size = new Size(labelWidth, 20);
page.Controls.Add(lblBeamSideSecondary);
radBeamSideSecondaryYes = new RadioButton();
radBeamSideSecondaryYes.Text = "是";
radBeamSideSecondaryYes.Checked = true;
radBeamSideSecondaryYes.Location = new Point(column2, yPos);
radBeamSideSecondaryYes.Size = new Size(40, 20);
page.Controls.Add(radBeamSideSecondaryYes);
radBeamSideSecondaryNo = new RadioButton();
radBeamSideSecondaryNo.Text = "否";
radBeamSideSecondaryNo.Location = new Point(column2 + 50, yPos);
radBeamSideSecondaryNo.Size = new Size(40, 20);
page.Controls.Add(radBeamSideSecondaryNo);
// 绘制方向
Label lblDirection = new Label();
lblDirection.Text = "绘制方向:";
lblDirection.Location = new Point(column3, yPos);
lblDirection.Size = new Size(70, 20);
page.Controls.Add(lblDirection);
radBeamSideSecondaryHorizontal = new RadioButton();
radBeamSideSecondaryHorizontal.Text = "横向";
radBeamSideSecondaryHorizontal.Location = new Point(column3 + 80, yPos);
radBeamSideSecondaryHorizontal.Size = new Size(50, 20);
page.Controls.Add(radBeamSideSecondaryHorizontal);
radBeamSideSecondaryVertical = new RadioButton();
radBeamSideSecondaryVertical.Text = "竖向";
radBeamSideSecondaryVertical.Location = new Point(column3 + 140, yPos);
radBeamSideSecondaryVertical.Size = new Size(50, 20);
radBeamSideSecondaryVertical.Checked = true;
page.Controls.Add(radBeamSideSecondaryVertical);
// 材料
Label lblMaterial = new Label();
lblMaterial.Text = "材料:";
lblMaterial.Location = new Point(column4, yPos);
lblMaterial.Size = new Size(50, 20);
page.Controls.Add(lblMaterial);
cmbBeamSideSecondaryMaterial = new ComboBox();
cmbBeamSideSecondaryMaterial.Items.AddRange(new object[] { "木方", "方钢", "钢管" });
cmbBeamSideSecondaryMaterial.SelectedIndex = 0;
cmbBeamSideSecondaryMaterial.Location = new Point(column4 + 50, yPos);
cmbBeamSideSecondaryMaterial.Size = new Size(80, 20);
page.Controls.Add(cmbBeamSideSecondaryMaterial);
yPos += 30;
// 规格
Label lblSpec = new Label();
lblSpec.Text = "规格:";
lblSpec.Location = new Point(column2, yPos);
lblSpec.Size = new Size(40, 20);
page.Controls.Add(lblSpec);
Label lblHeight = new Label();
lblHeight.Text = "高:";
lblHeight.Location = new Point(column2 + 50, yPos);
lblHeight.Size = new Size(30, 20);
page.Controls.Add(lblHeight);
txtBeamSideSecondaryHeight = new TextBox();
txtBeamSideSecondaryHeight.Text = "90";
txtBeamSideSecondaryHeight.Location = new Point(column2 + 80, yPos);
txtBeamSideSecondaryHeight.Size = new Size(50, 20);
page.Controls.Add(txtBeamSideSecondaryHeight);
Label lblWidth = new Label();
lblWidth.Text = "宽:";
lblWidth.Location = new Point(column2 + 140, yPos);
lblWidth.Size = new Size(30, 20);
page.Controls.Add(lblWidth);
txtBeamSideSecondaryWidth = new TextBox();
txtBeamSideSecondaryWidth.Text = "40";
txtBeamSideSecondaryWidth.Location = new Point(column2 + 170, yPos);
txtBeamSideSecondaryWidth.Size = new Size(50, 20);
page.Controls.Add(txtBeamSideSecondaryWidth);
Label lblSpacing = new Label();
lblSpacing.Text = "间距:";
lblSpacing.Location = new Point(column2 + 230, yPos);
lblSpacing.Size = new Size(40, 20);
page.Controls.Add(lblSpacing);
txtBeamSideSecondarySpacing = new TextBox();
txtBeamSideSecondarySpacing.Text = "200";
txtBeamSideSecondarySpacing.Location = new Point(column2 + 270, yPos);
txtBeamSideSecondarySpacing.Size = new Size(50, 20);
page.Controls.Add(txtBeamSideSecondarySpacing);
yPos += 40;
// 绘制梁侧主龙骨
Label lblBeamSidePrimary = new Label();
lblBeamSidePrimary.Text = "绘制梁侧主龙骨:";
lblBeamSidePrimary.Location = new Point(column1, yPos);
lblBeamSidePrimary.Size = new Size(labelWidth, 20);
page.Controls.Add(lblBeamSidePrimary);
radBeamSidePrimaryYes = new RadioButton();
radBeamSidePrimaryYes.Text = "是";
radBeamSidePrimaryYes.Checked = true;
radBeamSidePrimaryYes.Location = new Point(column2, yPos);
radBeamSidePrimaryYes.Size = new Size(40, 20);
page.Controls.Add(radBeamSidePrimaryYes);
radBeamSidePrimaryNo = new RadioButton();
radBeamSidePrimaryNo.Text = "否";
radBeamSidePrimaryNo.Location = new Point(column2 + 50, yPos);
radBeamSidePrimaryNo.Size = new Size(40, 20);
page.Controls.Add(radBeamSidePrimaryNo);
// 绘制方向
Label lblDirection2 = new Label();
lblDirection2.Text = "绘制方向:";
lblDirection2.Location = new Point(column3, yPos);
lblDirection2.Size = new Size(70, 20);
page.Controls.Add(lblDirection2);
radBeamSidePrimaryHorizontal = new RadioButton();
radBeamSidePrimaryHorizontal.Text = "横向";
radBeamSidePrimaryHorizontal.Location = new Point(column3 + 80, yPos);
radBeamSidePrimaryHorizontal.Size = new Size(50, 20);
radBeamSidePrimaryHorizontal.Checked = true;
page.Controls.Add(radBeamSidePrimaryHorizontal);
radBeamSidePrimaryVertical = new RadioButton();
radBeamSidePrimaryVertical.Text = "竖向";
radBeamSidePrimaryVertical.Location = new Point(column3 + 140, yPos);
radBeamSidePrimaryVertical.Size = new Size(50, 20);
page.Controls.Add(radBeamSidePrimaryVertical);
// 材料
Label lblMaterial2 = new Label();
lblMaterial2.Text = "材料:";
lblMaterial2.Location = new Point(column4, yPos);
lblMaterial2.Size = new Size(50, 20);
page.Controls.Add(lblMaterial2);
cmbBeamSidePrimaryMaterial = new ComboBox();
cmbBeamSidePrimaryMaterial.Items.AddRange(new object[] { "木方", "方钢", "钢管" });
cmbBeamSidePrimaryMaterial.SelectedIndex = 2;
cmbBeamSidePrimaryMaterial.Location = new Point(column4 + 50, yPos);
cmbBeamSidePrimaryMaterial.Size = new Size(80, 20);
page.Controls.Add(cmbBeamSidePrimaryMaterial);
yPos += 30;
// 规格
Label lblSpec2 = new Label();
lblSpec2.Text = "规格:";
lblSpec2.Location = new Point(column2, yPos);
lblSpec2.Size = new Size(40, 20);
page.Controls.Add(lblSpec2);
Label lblHeight2 = new Label();
lblHeight2.Text = "高:";
lblHeight2.Location = new Point(column2 + 50, yPos);
lblHeight2.Size = new Size(30, 20);
page.Controls.Add(lblHeight2);
txtBeamSidePrimaryHeight = new TextBox();
txtBeamSidePrimaryHeight.Text = "100";
txtBeamSidePrimaryHeight.Location = new Point(column2 + 80, yPos);
txtBeamSidePrimaryHeight.Size = new Size(50, 20);
page.Controls.Add(txtBeamSidePrimaryHeight);
Label lblWidth2 = new Label();
lblWidth2.Text = "宽:";
lblWidth2.Location = new Point(column2 + 140, yPos);
lblWidth2.Size = new Size(30, 20);
page.Controls.Add(lblWidth2);
txtBeamSidePrimaryWidth = new TextBox();
txtBeamSidePrimaryWidth.Text = "100";
txtBeamSidePrimaryWidth.Location = new Point(column2 + 170, yPos);
txtBeamSidePrimaryWidth.Size = new Size(50, 20);
page.Controls.Add(txtBeamSidePrimaryWidth);
Label lblDiameter = new Label();
lblDiameter.Text = "直径:";
lblDiameter.Location = new Point(column2 + 230, yPos);
lblDiameter.Size = new Size(40, 20);
page.Controls.Add(lblDiameter);
txtBeamSidePrimaryDiameter = new TextBox();
txtBeamSidePrimaryDiameter.Text = "48";
txtBeamSidePrimaryDiameter.Location = new Point(column2 + 270, yPos);
txtBeamSidePrimaryDiameter.Size = new Size(50, 20);
page.Controls.Add(txtBeamSidePrimaryDiameter);
yPos += 40;
// 梁对拉螺栓设置
Label lblBeamBolt = new Label();
lblBeamBolt.Text = "梁对拉螺栓设置:";
lblBeamBolt.Location = new Point(column1, yPos);
lblBeamBolt.Size = new Size(labelWidth, 20);
page.Controls.Add(lblBeamBolt);
Label lblBottomOffset = new Label();
lblBottomOffset.Text = "底第一道螺栓离梁底高:";
lblBottomOffset.Location = new Point(column2, yPos);
lblBottomOffset.Size = new Size(150, 20);
page.Controls.Add(lblBottomOffset);
txtBeamBoltBottomOffset = new TextBox();
txtBeamBoltBottomOffset.Text = "150";
txtBeamBoltBottomOffset.Location = new Point(column2 + 160, yPos);
txtBeamBoltBottomOffset.Size = new Size(50, 20);
page.Controls.Add(txtBeamBoltBottomOffset);
Label lblTopOffset = new Label();
lblTopOffset.Text = "顶第一道螺栓离板底高:";
lblTopOffset.Location = new Point(column3, yPos);
lblTopOffset.Size = new Size(150, 20);
page.Controls.Add(lblTopOffset);
txtBeamBoltTopOffset = new TextBox();
txtBeamBoltTopOffset.Text = "150";
txtBeamBoltTopOffset.Location = new Point(column3 + 160, yPos);
txtBeamBoltTopOffset.Size = new Size(50, 20);
page.Controls.Add(txtBeamBoltTopOffset);
yPos += 30;
Label lblMaxSpacing = new Label();
lblMaxSpacing.Text = "螺栓最大间距:";
lblMaxSpacing.Location = new Point(column2, yPos);
lblMaxSpacing.Size = new Size(100, 20);
page.Controls.Add(lblMaxSpacing);
txtBeamBoltMaxSpacing = new TextBox();
txtBeamBoltMaxSpacing.Text = "500";
txtBeamBoltMaxSpacing.Location = new Point(column2 + 110, yPos);
txtBeamBoltMaxSpacing.Size = new Size(50, 20);
page.Controls.Add(txtBeamBoltMaxSpacing);
yPos += 40;
// 绘制梁底次龙骨
Label lblBeamBottomSecondary = new Label();
lblBeamBottomSecondary.Text = "绘制梁底次龙骨:";
lblBeamBottomSecondary.Location = new Point(column1, yPos);
lblBeamBottomSecondary.Size = new Size(labelWidth, 20);
page.Controls.Add(lblBeamBottomSecondary);
radBeamBottomSecondaryYes = new RadioButton();
radBeamBottomSecondaryYes.Text = "是";
radBeamBottomSecondaryYes.Checked = true;
radBeamBottomSecondaryYes.Location = new Point(column2, yPos);
radBeamBottomSecondaryYes.Size = new Size(40, 20);
page.Controls.Add(radBeamBottomSecondaryYes);
radBeamBottomSecondaryNo = new RadioButton();
radBeamBottomSecondaryNo.Text = "否";
radBeamBottomSecondaryNo.Location = new Point(column2 + 50, yPos);
radBeamBottomSecondaryNo.Size = new Size(40, 20);
page.Controls.Add(radBeamBottomSecondaryNo);
// 绘制方向
Label lblDirection3 = new Label();
lblDirection3.Text = "绘制方向:";
lblDirection3.Location = new Point(column3, yPos);
lblDirection3.Size = new Size(70, 20);
page.Controls.Add(lblDirection3);
radBeamBottomSecondaryHorizontal = new RadioButton();
radBeamBottomSecondaryHorizontal.Text = "横向";
radBeamBottomSecondaryHorizontal.Location = new Point(column3 + 80, yPos);
radBeamBottomSecondaryHorizontal.Size = new Size(50, 20);
page.Controls.Add(radBeamBottomSecondaryHorizontal);
radBeamBottomSecondaryLongitudinal = new RadioButton();
radBeamBottomSecondaryLongitudinal.Text = "纵向";
radBeamBottomSecondaryLongitudinal.Location = new Point(column3 + 140, yPos);
radBeamBottomSecondaryLongitudinal.Size = new Size(50, 20);
radBeamBottomSecondaryLongitudinal.Checked = true;
page.Controls.Add(radBeamBottomSecondaryLongitudinal);
// 材料
Label lblMaterial3 = new Label();
lblMaterial3.Text = "材料:";
lblMaterial3.Location = new Point(column4, yPos);
lblMaterial3.Size = new Size(50, 20);
page.Controls.Add(lblMaterial3);
cmbBeamBottomSecondaryMaterial = new ComboBox();
cmbBeamBottomSecondaryMaterial.Items.AddRange(new object[] { "木方", "方钢", "钢管" });
cmbBeamBottomSecondaryMaterial.SelectedIndex = 0;
cmbBeamBottomSecondaryMaterial.Location = new Point(column4 + 50, yPos);
cmbBeamBottomSecondaryMaterial.Size = new Size(80, 20);
page.Controls.Add(cmbBeamBottomSecondaryMaterial);
yPos += 30;
// 规格
Label lblSpec3 = new Label();
lblSpec3.Text = "规格:";
lblSpec3.Location = new Point(column2, yPos);
lblSpec3.Size = new Size(40, 20);
page.Controls.Add(lblSpec3);
Label lblHeight3 = new Label();
lblHeight3.Text = "高:";
lblHeight3.Location = new Point(column2 + 50, yPos);
lblHeight3.Size = new Size(30, 20);
page.Controls.Add(lblHeight3);
txtBeamBottomSecondaryHeight = new TextBox();
txtBeamBottomSecondaryHeight.Text = "90";
txtBeamBottomSecondaryHeight.Location = new Point(column2 + 80, yPos);
txtBeamBottomSecondaryHeight.Size = new Size(50, 20);
page.Controls.Add(txtBeamBottomSecondaryHeight);
Label lblWidth3 = new Label();
lblWidth3.Text = "宽:";
lblWidth3.Location = new Point(column2 + 140, yPos);
lblWidth3.Size = new Size(30, 20);
page.Controls.Add(lblWidth3);
txtBeamBottomSecondaryWidth = new TextBox();
txtBeamBottomSecondaryWidth.Text = "40";
txtBeamBottomSecondaryWidth.Location = new Point(column2 + 170, yPos);
txtBeamBottomSecondaryWidth.Size = new Size(50, 20);
page.Controls.Add(txtBeamBottomSecondaryWidth);
Label lblSpacing3 = new Label();
lblSpacing3.Text = "间距:";
lblSpacing3.Location = new Point(column2 + 230, yPos);
lblSpacing3.Size = new Size(40, 20);
page.Controls.Add(lblSpacing3);
txtBeamBottomSecondarySpacing = new TextBox();
txtBeamBottomSecondarySpacing.Text = "200";
txtBeamBottomSecondarySpacing.Location = new Point(column2 + 270, yPos);
txtBeamBottomSecondarySpacing.Size = new Size(50, 20);
page.Controls.Add(txtBeamBottomSecondarySpacing);
yPos += 40;
// 绘制梁底主龙骨
Label lblBeamBottomPrimary = new Label();
lblBeamBottomPrimary.Text = "绘制梁底主龙骨:";
lblBeamBottomPrimary.Location = new Point(column1, yPos);
lblBeamBottomPrimary.Size = new Size(labelWidth, 20);
page.Controls.Add(lblBeamBottomPrimary);
radBeamBottomPrimaryYes = new RadioButton();
radBeamBottomPrimaryYes.Text = "是";
radBeamBottomPrimaryYes.Checked = true;
radBeamBottomPrimaryYes.Location = new Point(column2, yPos);
radBeamBottomPrimaryYes.Size = new Size(40, 20);
page.Controls.Add(radBeamBottomPrimaryYes);
radBeamBottomPrimaryNo = new RadioButton();
radBeamBottomPrimaryNo.Text = "否";
radBeamBottomPrimaryNo.Location = new Point(column2 + 50, yPos);
radBeamBottomPrimaryNo.Size = new Size(40, 20);
page.Controls.Add(radBeamBottomPrimaryNo);
// 材料
Label lblMaterial4 = new Label();
lblMaterial4.Text = "材料:";
lblMaterial4.Location = new Point(column3, yPos);
lblMaterial4.Size = new Size(50, 20);
page.Controls.Add(lblMaterial4);
cmbBeamBottomPrimaryMaterial = new ComboBox();
cmbBeamBottomPrimaryMaterial.Items.AddRange(new object[] { "木方", "方钢", "钢管" });
cmbBeamBottomPrimaryMaterial.SelectedIndex = 2;
cmbBeamBottomPrimaryMaterial.Location = new Point(column3 + 50, yPos);
cmbBeamBottomPrimaryMaterial.Size = new Size(80, 20);
page.Controls.Add(cmbBeamBottomPrimaryMaterial);
yPos += 30;
// 规格
Label lblSpec4 = new Label();
lblSpec4.Text = "规格:";
lblSpec4.Location = new Point(column2, yPos);
lblSpec4.Size = new Size(40, 20);
page.Controls.Add(lblSpec4);
Label lblHeight4 = new Label();
lblHeight4.Text = "高:";
lblHeight4.Location = new Point(column2 + 50, yPos);
lblHeight4.Size = new Size(30, 20);
page.Controls.Add(lblHeight4);
txtBeamBottomPrimaryHeight = new TextBox();
txtBeamBottomPrimaryHeight.Text = "100";
txtBeamBottomPrimaryHeight.Location = new Point(column2 + 80, yPos);
txtBeamBottomPrimaryHeight.Size = new Size(50, 20);
page.Controls.Add(txtBeamBottomPrimaryHeight);
Label lblWidth4 = new Label();
lblWidth4.Text = "宽:";
lblWidth4.Location = new Point(column2 + 140, yPos);
lblWidth4.Size = new Size(30, 20);
page.Controls.Add(lblWidth4);
txtBeamBottomPrimaryWidth = new TextBox();
txtBeamBottomPrimaryWidth.Text = "100";
txtBeamBottomPrimaryWidth.Location = new Point(column2 + 170, yPos);
txtBeamBottomPrimaryWidth.Size = new Size(50, 20);
page.Controls.Add(txtBeamBottomPrimaryWidth);
}
private void InitializeSlabPage(TabPage page)
{
int yPos = 15;
int labelWidth = 120;
int controlSpacing = 10;
int column1 = 20;
int column2 = column1 + labelWidth + controlSpacing;
int column3 = column2 + 100;
int column4 = column3 + 100;
// 标题
Label lblTitle = new Label();
lblTitle.Text = "板龙骨设置参数";
lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 10, System.Drawing.FontStyle.Bold);
lblTitle.Location = new Point(column1, yPos);
lblTitle.Size = new Size(200, 20);
page.Controls.Add(lblTitle);
yPos += 30;
// 默认楼板厚和模板厚
Label lblDefaultSlab = new Label();
lblDefaultSlab.Text = "默认楼板厚:";
lblDefaultSlab.Location = new Point(column1, yPos);
lblDefaultSlab.Size = new Size(90, 20);
page.Controls.Add(lblDefaultSlab);
txtDefaultSlabThickness = new TextBox();
txtDefaultSlabThickness.Text = "120";
txtDefaultSlabThickness.Location = new Point(column1 + 100, yPos);
txtDefaultSlabThickness.Size = new Size(50, 20);
page.Controls.Add(txtDefaultSlabThickness);
Label lblFormwork = new Label();
lblFormwork.Text = "模板厚:";
lblFormwork.Location = new Point(column1 + 160, yPos);
lblFormwork.Size = new Size(70, 20);
page.Controls.Add(lblFormwork);
txtFormworkThickness = new TextBox();
txtFormworkThickness.Text = "15";
txtFormworkThickness.Location = new Point(column1 + 230, yPos);
txtFormworkThickness.Size = new Size(50, 20);
page.Controls.Add(txtFormworkThickness);
yPos += 40;
// 绘制板底次龙骨
Label lblSlabSecondary = new Label();
lblSlabSecondary.Text = "绘制板底次龙骨:";
lblSlabSecondary.Location = new Point(column1, yPos);
lblSlabSecondary.Size = new Size(labelWidth, 20);
page.Controls.Add(lblSlabSecondary);
radSlabSecondaryYes = new RadioButton();
radSlabSecondaryYes.Text = "是";
radSlabSecondaryYes.Checked = true;
radSlabSecondaryYes.Location = new Point(column2, yPos);
radSlabSecondaryYes.Size = new Size(40, 20);
page.Controls.Add(radSlabSecondaryYes);
radSlabSecondaryNo = new RadioButton();
radSlabSecondaryNo.Text = "否";
radSlabSecondaryNo.Location = new Point(column2 + 50, yPos);
radSlabSecondaryNo.Size = new Size(40, 20);
page.Controls.Add(radSlabSecondaryNo);
// 绘制方向
Label lblDirection = new Label();
lblDirection.Text = "绘制方向:";
lblDirection.Location = new Point(column3, yPos);
lblDirection.Size = new Size(70, 20);
page.Controls.Add(lblDirection);
radSlabSecondaryHorizontal = new RadioButton();
radSlabSecondaryHorizontal.Text = "横向";
radSlabSecondaryHorizontal.Location = new Point(column3 + 80, yPos);
radSlabSecondaryHorizontal.Size = new Size(50, 20);
page.Controls.Add(radSlabSecondaryHorizontal);
radSlabSecondaryLongitudinal = new RadioButton();
radSlabSecondaryLongitudinal.Text = "纵向";
radSlabSecondaryLongitudinal.Location = new Point(column3 + 140, yPos);
radSlabSecondaryLongitudinal.Size = new Size(50, 20);
radSlabSecondaryLongitudinal.Checked = true;
page.Controls.Add(radSlabSecondaryLongitudinal);
// 材料
Label lblMaterial = new Label();
lblMaterial.Text = "材料:";
lblMaterial.Location = new Point(column4, yPos);
lblMaterial.Size = new Size(50, 20);
page.Controls.Add(lblMaterial);
cmbSlabSecondaryMaterial = new ComboBox();
cmbSlabSecondaryMaterial.Items.AddRange(new object[] { "木方", "方钢", "钢管" });
cmbSlabSecondaryMaterial.SelectedIndex = 0;
cmbSlabSecondaryMaterial.Location = new Point(column4 + 50, yPos);
cmbSlabSecondaryMaterial.Size = new Size(80, 20);
page.Controls.Add(cmbSlabSecondaryMaterial);
yPos += 30;
// 规格
Label lblSpec = new Label();
lblSpec.Text = "规格:";
lblSpec.Location = new Point(column2, yPos);
lblSpec.Size = new Size(40, 20);
page.Controls.Add(lblSpec);
Label lblHeight = new Label();
lblHeight.Text = "高:";
lblHeight.Location = new Point(column2 + 50, yPos);
lblHeight.Size = new Size(30, 20);
page.Controls.Add(lblHeight);
txtSlabSecondaryHeight = new TextBox();
txtSlabSecondaryHeight.Text = "90";
txtSlabSecondaryHeight.Location = new Point(column2 + 80, yPos);
txtSlabSecondaryHeight.Size = new Size(50, 20);
page.Controls.Add(txtSlabSecondaryHeight);
Label lblWidth = new Label();
lblWidth.Text = "宽:";
lblWidth.Location = new Point(column2 + 140, yPos);
lblWidth.Size = new Size(30, 20);
page.Controls.Add(lblWidth);
txtSlabSecondaryWidth = new TextBox();
txtSlabSecondaryWidth.Text = "40";
txtSlabSecondaryWidth.Location = new Point(column2 + 170, yPos);
txtSlabSecondaryWidth.Size = new Size(50, 20);
page.Controls.Add(txtSlabSecondaryWidth);
Label lblSpacing = new Label();
lblSpacing.Text = "间距:";
lblSpacing.Location = new Point(column2 + 230, yPos);
lblSpacing.Size = new Size(40, 20);
page.Controls.Add(lblSpacing);
txtSlabSecondarySpacing = new TextBox();
txtSlabSecondarySpacing.Text = "200";
txtSlabSecondarySpacing.Location = new Point(column2 + 270, yPos);
txtSlabSecondarySpacing.Size = new Size(50, 20);
page.Controls.Add(txtSlabSecondarySpacing);
yPos += 40;
// 绘制板底主龙骨
Label lblSlabPrimary = new Label();
lblSlabPrimary.Text = "绘制板底主龙骨:";
lblSlabPrimary.Location = new Point(column1, yPos);
lblSlabPrimary.Size = new Size(labelWidth, 20);
page.Controls.Add(lblSlabPrimary);
radSlabPrimaryYes = new RadioButton();
radSlabPrimaryYes.Text = "是";
radSlabPrimaryYes.Checked = true;
radSlabPrimaryYes.Location = new Point(column2, yPos);
radSlabPrimaryYes.Size = new Size(40, 20);
page.Controls.Add(radSlabPrimaryYes);
radSlabPrimaryNo = new RadioButton();
radSlabPrimaryNo.Text = "否";
radSlabPrimaryNo.Location = new Point(column2 + 50, yPos);
radSlabPrimaryNo.Size = new Size(40, 20);
page.Controls.Add(radSlabPrimaryNo);
// 材料
Label lblMaterial2 = new Label();
lblMaterial2.Text = "材料:";
lblMaterial2.Location = new Point(column3, yPos);
lblMaterial2.Size = new Size(50, 20);
page.Controls.Add(lblMaterial2);
cmbSlabPrimaryMaterial = new ComboBox();
cmbSlabPrimaryMaterial.Items.AddRange(new object[] { "木方", "方钢", "钢管" });
cmbSlabPrimaryMaterial.SelectedIndex = 2;
cmbSlabPrimaryMaterial.Location = new Point(column3 + 50, yPos);
cmbSlabPrimaryMaterial.Size = new Size(80, 20);
page.Controls.Add(cmbSlabPrimaryMaterial);
yPos += 30;
// 规格
Label lblSpec2 = new Label();
lblSpec2.Text = "规格:";
lblSpec2.Location = new Point(column2, yPos);
lblSpec2.Size = new Size(40, 20);
page.Controls.Add(lblSpec2);
Label lblHeight2 = new Label();
lblHeight2.Text = "高:";
lblHeight2.Location = new Point(column2 + 50, yPos);
lblHeight2.Size = new Size(30, 20);
page.Controls.Add(lblHeight2);
txtSlabPrimaryHeight = new TextBox();
txtSlabPrimaryHeight.Text = "100";
txtSlabPrimaryHeight.Location = new Point(column2 + 80, yPos);
txtSlabPrimaryHeight.Size = new Size(50, 20);
page.Controls.Add(txtSlabPrimaryHeight);
Label lblWidth2 = new Label();
lblWidth2.Text = "宽:";
lblWidth2.Location = new Point(column2 + 140, yPos);
lblWidth2.Size = new Size(30, 20);
page.Controls.Add(lblWidth2);
txtSlabPrimaryWidth = new TextBox();
txtSlabPrimaryWidth.Text = "100";
txtSlabPrimaryWidth.Location = new Point(column2 + 170, yPos);
txtSlabPrimaryWidth.Size = new Size(50, 20);
page.Controls.Add(txtSlabPrimaryWidth);
}
private void SetupEventHandlers()
{
// 设置事件处理器
radBeamSideSecondaryYes.CheckedChanged += (s, e) =>
{
bool enabled = radBeamSideSecondaryYes.Checked;
radBeamSideSecondaryHorizontal.Enabled = enabled;
radBeamSideSecondaryVertical.Enabled = enabled;
cmbBeamSideSecondaryMaterial.Enabled = enabled;
txtBeamSideSecondaryHeight.Enabled = enabled;
txtBeamSideSecondaryWidth.Enabled = enabled;
txtBeamSideSecondarySpacing.Enabled = enabled;
if (enabled)
{
UpdateBeamSideSecondaryControls();
}
};
radBeamSideSecondaryNo.CheckedChanged += (s, e) =>
{
bool enabled = !radBeamSideSecondaryNo.Checked;
radBeamSideSecondaryHorizontal.Enabled = enabled;
radBeamSideSecondaryVertical.Enabled = enabled;
cmbBeamSideSecondaryMaterial.Enabled = enabled;
txtBeamSideSecondaryHeight.Enabled = enabled;
txtBeamSideSecondaryWidth.Enabled = enabled;
txtBeamSideSecondarySpacing.Enabled = enabled;
};
radBeamSideSecondaryHorizontal.CheckedChanged += (s, e) => UpdateBeamSideSecondaryControls();
radBeamSideSecondaryVertical.CheckedChanged += (s, e) => UpdateBeamSideSecondaryControls();
cmbBeamSideSecondaryMaterial.SelectedIndexChanged += (s, e) => UpdateBeamSideSecondaryControls();
// 其他事件处理器...
}
private void UpdateBeamSideSecondaryControls()
{
bool isEnabled = radBeamSideSecondaryYes.Checked;
bool isHorizontal = radBeamSideSecondaryHorizontal.Checked;
bool isVertical = radBeamSideSecondaryVertical.Checked;
string material = cmbBeamSideSecondaryMaterial.Text;
if (!isEnabled)
{
// 如果选择"否",禁用所有控件
radBeamSideSecondaryHorizontal.Enabled = false;
radBeamSideSecondaryVertical.Enabled = false;
cmbBeamSideSecondaryMaterial.Enabled = false;
txtBeamSideSecondaryHeight.Enabled = false;
txtBeamSideSecondaryWidth.Enabled = false;
txtBeamSideSecondarySpacing.Enabled = false;
return;
}
// 根据文档要求更新控件状态
if (isVertical)
{
txtBeamSideSecondaryHeight.Enabled = false;
txtBeamSideSecondarySpacing.Enabled = false;
txtBeamSideSecondaryWidth.Enabled = true;
}
else if (isHorizontal)
{
txtBeamSideSecondaryHeight.Enabled = true;
txtBeamSideSecondarySpacing.Enabled = true;
txtBeamSideSecondaryWidth.Enabled = true;
}
if (material == "钢管")
{
txtBeamSideSecondaryHeight.Enabled = false;
txtBeamSideSecondaryWidth.Enabled = false;
txtBeamSideSecondarySpacing.Enabled = false;
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.OK)
{
// 收集参数
Parameters.BeamSideSecondary.Enabled = radBeamSideSecondaryYes.Checked;
Parameters.BeamSideSecondary.Direction = radBeamSideSecondaryHorizontal.Checked ? "Horizontal" : "Vertical";
Parameters.BeamSideSecondary.Material = cmbBeamSideSecondaryMaterial.Text;
if (double.TryParse(txtBeamSideSecondaryHeight.Text, out double height))
Parameters.BeamSideSecondary.Height = height;
if (double.TryParse(txtBeamSideSecondaryWidth.Text, out double width))
Parameters.BeamSideSecondary.Width = width;
if (double.TryParse(txtBeamSideSecondarySpacing.Text, out double spacing))
Parameters.BeamSideSecondary.Spacing = spacing;
// 收集其他参数...
Parameters.DefaultSlabThickness = double.Parse(txtDefaultSlabThickness.Text);
Parameters.FormworkThickness = double.Parse(txtFormworkThickness.Text);
// 梁侧主龙骨参数
Parameters.BeamSidePrimary.Enabled = radBeamSidePrimaryYes.Checked;
Parameters.BeamSidePrimary.Direction = radBeamSidePrimaryHorizontal.Checked ? "Horizontal" : "Vertical";
Parameters.BeamSidePrimary.Material = cmbBeamSidePrimaryMaterial.Text;
if (double.TryParse(txtBeamSidePrimaryHeight.Text, out double primaryHeight))
Parameters.BeamSidePrimary.Height = primaryHeight;
if (double.TryParse(txtBeamSidePrimaryWidth.Text, out double primaryWidth))
Parameters.BeamSidePrimary.Width = primaryWidth;
if (double.TryParse(txtBeamSidePrimaryDiameter.Text, out double diameter))
Parameters.BeamSidePrimary.Diameter = diameter;
// 梁对拉螺栓参数
if (double.TryParse(txtBeamBoltBottomOffset.Text, out double bottomOffset))
Parameters.BeamBolt.BottomOffset = bottomOffset;
if (double.TryParse(txtBeamBoltTopOffset.Text, out double topOffset))
Parameters.BeamBolt.TopOffset = topOffset;
if (double.TryParse(txtBeamBoltMaxSpacing.Text, out double maxSpacing))
Parameters.BeamBolt.MaxSpacing = maxSpacing;
// 梁底次龙骨参数
Parameters.BeamBottomSecondary.Enabled = radBeamBottomSecondaryYes.Checked;
Parameters.BeamBottomSecondary.Direction = radBeamBottomSecondaryLongitudinal.Checked ? "Longitudinal" : "Horizontal";
Parameters.BeamBottomSecondary.Material = cmbBeamBottomSecondaryMaterial.Text;
if (double.TryParse(txtBeamBottomSecondaryHeight.Text, out double bottomSecondaryHeight))
Parameters.BeamBottomSecondary.Height = bottomSecondaryHeight;
if (double.TryParse(txtBeamBottomSecondaryWidth.Text, out double bottomSecondaryWidth))
Parameters.BeamBottomSecondary.Width = bottomSecondaryWidth;
if (double.TryParse(txtBeamBottomSecondarySpacing.Text, out double bottomSecondarySpacing))
Parameters.BeamBottomSecondary.Spacing = bottomSecondarySpacing;
// 梁底主龙骨参数
Parameters.BeamBottomPrimary.Enabled = radBeamBottomPrimaryYes.Checked;
Parameters.BeamBottomPrimary.Material = cmbBeamBottomPrimaryMaterial.Text;
if (double.TryParse(txtBeamBottomPrimaryHeight.Text, out double bottomPrimaryHeight))
Parameters.BeamBottomPrimary.Height = bottomPrimaryHeight;
if (double.TryParse(txtBeamBottomPrimaryWidth.Text, out double bottomPrimaryWidth))
Parameters.BeamBottomPrimary.Width = bottomPrimaryWidth;
// 板底次龙骨参数
Parameters.Slab.SecondaryEnabled = radSlabSecondaryYes.Checked;
Parameters.Slab.SecondaryDirection = radSlabSecondaryLongitudinal.Checked ? "Longitudinal" : "Horizontal";
Parameters.Slab.SecondaryMaterial = cmbSlabSecondaryMaterial.Text;
if (double.TryParse(txtSlabSecondaryHeight.Text, out double slabSecondaryHeight))
Parameters.Slab.SecondaryHeight = slabSecondaryHeight;
if (double.TryParse(txtSlabSecondaryWidth.Text, out double slabSecondaryWidth))
Parameters.Slab.SecondaryWidth = slabSecondaryWidth;
if (double.TryParse(txtSlabSecondarySpacing.Text, out double slabSecondarySpacing))
Parameters.Slab.SecondarySpacing = slabSecondarySpacing;
// 板底主龙骨参数
Parameters.Slab.PrimaryEnabled = radSlabPrimaryYes.Checked;
Parameters.Slab.PrimaryMaterial = cmbSlabPrimaryMaterial.Text;
if (double.TryParse(txtSlabPrimaryHeight.Text, out double slabPrimaryHeight))
Parameters.Slab.PrimaryHeight = slabPrimaryHeight;
if (double.TryParse(txtSlabPrimaryWidth.Text, out double slabPrimaryWidth))
Parameters.Slab.PrimaryWidth = slabPrimaryWidth;
}
base.OnFormClosing(e);
}
}
public class BeamSlabCommand
{
[CommandMethod("DB")]
public void StartBeamSlab()
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
// 显示参数设置窗口
using (ParameterForm form = new ParameterForm())
{
// 使用完全限定名解决Application歧义
if (Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(null, form, false) != DialogResult.OK)
return;
BeamSlabParameters parameters = form.Parameters;
// 开始绘制循环
DrawBeamSlab(doc, ed, parameters);
}
}
private void DrawBeamSlab(Document doc, Editor ed, BeamSlabParameters parameters)
{
Database db = doc.Database;
List<Point3d> beamPoints = new List<Point3d>();
List<double> beamHeights = new List<double>();
List<double> slabThicknesses = new List<double>();
while (true)
{
// 1. 获取梁的第一点
PromptPointResult ppr1 = ed.GetPoint("\n请点击梁的第一点: ");
if (ppr1.Status != PromptStatus.OK) break;
// 2. 获取梁的第二点
PromptPointResult ppr2 = ed.GetPoint("\n请点击梁的第二点: ");
if (ppr2.Status != PromptStatus.OK) break;
// 3. 获取梁高
PromptDoubleOptions pdoHeight = new PromptDoubleOptions("\n请输入梁高(mm): ");
pdoHeight.AllowNegative = false;
pdoHeight.DefaultValue = 500; // 默认梁高500mm
PromptDoubleResult pdrHeight = ed.GetDouble(pdoHeight);
if (pdrHeight.Status != PromptStatus.OK) break;
double beamHeight = pdrHeight.Value;
// 4. 获取板厚或升降板信息
double slabThickness = GetSlabThickness(ed, parameters.DefaultSlabThickness);
if (double.IsNaN(slabThickness)) break;
beamPoints.Add(ppr1.Value);
beamPoints.Add(ppr2.Value);
beamHeights.Add(beamHeight);
slabThicknesses.Add(slabThickness);
// 绘制梁和板
using (Transaction tr = db.TransactionManager.StartTransaction())
{
DrawBeamAndSlab(tr, db, ppr1.Value, ppr2.Value, beamHeight, slabThickness, parameters);
tr.Commit();
}
}
// 完成绘制,闭合区域并填充
if (beamPoints.Count >= 4)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
CompleteDrawing(tr, db, beamPoints, beamHeights, slabThicknesses, parameters);
tr.Commit();
}
}
}
private double GetSlabThickness(Editor ed, double defaultThickness)
{
PromptKeywordOptions pko = new PromptKeywordOptions("\n请输入[板厚(A)/升降板(S)]: ");
pko.Keywords.Add("A");
pko.Keywords.Add("S");
pko.Keywords.Default = "A";
PromptResult pr = ed.GetKeywords(pko);
if (pr.Status != PromptStatus.OK) return double.NaN;
if (pr.StringResult == "A")
{
PromptDoubleOptions pdo = new PromptDoubleOptions("\n输入板厚(mm): ");
pdo.DefaultValue = defaultThickness;
pdo.AllowNegative = false;
PromptDoubleResult pdr = ed.GetDouble(pdo);
if (pdr.Status != PromptStatus.OK) return double.NaN;
return pdr.Value;
}
else // "S"
{
PromptDoubleOptions pdo = new PromptDoubleOptions("\n请输入升降板高度(升板为正数,降板为负数)mm: ");
pdo.AllowNegative = true;
PromptDoubleResult pdr = ed.GetDouble(pdo);
if (pdr.Status != PromptStatus.OK) return double.NaN;
return pdr.Value;
}
}
private void DrawBeamAndSlab(Transaction tr, Database db, Point3d pt1, Point3d pt2, double beamHeight, double slabThickness, BeamSlabParameters parameters)
{
// 计算偏移量
double offset = beamHeight - slabThickness;
// 绘制梁的双线
Vector3d direction = (pt2 - pt1).GetNormal();
Vector3d perpendicular = direction.GetPerpendicularVector();
double halfFormwork = parameters.FormworkThickness / 2;
Point3d innerPt1 = pt1 + perpendicular * halfFormwork;
Point3d innerPt2 = pt2 + perpendicular * halfFormwork;
Point3d outerPt1 = pt1 - perpendicular * halfFormwork;
Point3d outerPt2 = pt2 - perpendicular * halfFormwork;
// 创建梁的双线
Polyline beamInner = CreatePolyline(new[] { innerPt1, innerPt2 });
Polyline beamOuter = CreatePolyline(new[] { outerPt1, outerPt2 });
// 添加到数据库
AddToModelSpace(tr, db, beamInner);
AddToModelSpace(tr, db, beamOuter);
// 绘制竖向梁线
Vector3d verticalOffset = new Vector3d(0, 0, -offset);
Polyline vertical1 = CreatePolyline(new[] { innerPt1, innerPt1 + verticalOffset });
Polyline vertical2 = CreatePolyline(new[] { innerPt2, innerPt2 + verticalOffset });
AddToModelSpace(tr, db, vertical1);
AddToModelSpace(tr, db, vertical2);
// 绘制板底线
Point3d slabPt1 = innerPt1 + verticalOffset;
Point3d slabPt2 = innerPt2 + verticalOffset;
Polyline slabLine = CreatePolyline(new[] { slabPt1, slabPt2 });
AddToModelSpace(tr, db, slabLine);
// 根据参数绘制龙骨和对拉螺栓
if (parameters.BeamSideSecondary.Enabled)
DrawBeamSideSecondary(tr, db, innerPt1, innerPt2, verticalOffset, parameters.BeamSideSecondary);
if (parameters.BeamSidePrimary.Enabled)
DrawBeamSidePrimary(tr, db, innerPt1, innerPt2, verticalOffset, parameters.BeamSidePrimary);
if (parameters.BeamBolt.Enabled)
DrawBeamBolts(tr, db, innerPt1, innerPt2, verticalOffset, parameters.BeamBolt);
}
private void DrawBeamSideSecondary(Transaction tr, Database db, Point3d pt1, Point3d pt2, Vector3d verticalOffset, BeamSideSecondaryParameters parameters)
{
// 根据参数绘制梁侧次龙骨
if (parameters.Direction == "Horizontal")
{
// 水平布置
double spacing = parameters.Spacing;
double distance = pt1.DistanceTo(pt2);
int count = (int)(distance / spacing);
for (int i = 0; i <= count; i++)
{
double ratio = (double)i / count;
Point3d position = pt1 + (pt2 - pt1) * ratio;
// 绘制矩形木方或方钢
DrawTimberOrSteel(tr, db, position, verticalOffset, parameters.Material, parameters.Height, parameters.Width);
}
}
else
{
// 竖向布置
Point3d start = pt1 + (pt2 - pt1) / 2; // 中间位置
DrawVerticalTimberOrSteel(tr, db, start, verticalOffset, parameters.Material, parameters.Width);
}
}
private void DrawBeamSidePrimary(Transaction tr, Database db, Point3d pt1, Point3d pt2, Vector3d verticalOffset, BeamSidePrimaryParameters parameters)
{
// 实现梁侧主龙骨绘制逻辑
// 根据参数绘制梁侧主龙骨
// 这里需要根据实际需求实现
}
private void DrawBeamBolts(Transaction tr, Database db, Point3d pt1, Point3d pt2, Vector3d verticalOffset, BeamBoltParameters parameters)
{
// 实现对拉螺栓绘制逻辑
// 根据参数绘制对拉螺栓
// 这里需要根据实际需求实现
}
private void DrawTimberOrSteel(Transaction tr, Database db, Point3d position, Vector3d verticalOffset, string material, double height, double width)
{
// 根据材料类型绘制木方或方钢
if (material == "木方")
{
// 绘制木方矩形并填充
Polyline timber = CreateRectangle(position, width, height);
AddToModelSpace(tr, db, timber);
// 填充木方图案
Hatch hatch = CreateHatch(timber, "AHSI36", 100);
AddToModelSpace(tr, db, hatch);
}
else if (material == "方钢" || material == "钢管")
{
// 绘制方钢或钢管(双线)
double thickness = material == "方钢" ? 3 : 1.5; // 方钢壁厚3mm,钢管壁厚1.5mm
DrawHollowSection(tr, db, position, width, height, thickness);
}
}
private void DrawVerticalTimberOrSteel(Transaction tr, Database db, Point3d position, Vector3d verticalOffset, string material, double width)
{
// 实现竖向木方或方钢绘制逻辑
// 这里需要根据实际需求实现
}
private void DrawHollowSection(Transaction tr, Database db, Point3d position, double width, double height, double thickness)
{
// 实现空心截面绘制逻辑
// 这里需要根据实际需求实现
}
private void CompleteDrawing(Transaction tr, Database db, List<Point3d> beamPoints, List<double> beamHeights, List<double> slabThicknesses, BeamSlabParameters parameters)
{
// 创建闭合多段线框
Polyline boundary = new Polyline();
// 添加所有点形成闭合区域
for (int i = 0; i < beamPoints.Count; i++)
{
Point3d point = beamPoints[i];
boundary.AddVertexAt(i, new Point2d(point.X, point.Y), 0, 0, 0);
}
boundary.Closed = true;
AddToModelSpace(tr, db, boundary);
// 填充区域
Hatch hatch = CreateHatch(boundary, "AR-SAND", 100);
AddToModelSpace(tr, db, hatch);
}
private Polyline CreatePolyline(Point3d[] points)
{
Polyline pl = new Polyline();
for (int i = 0; i < points.Length; i++)
{
pl.AddVertexAt(i, new Point2d(points[i].X, points[i].Y), 0, 0, 0);
}
return pl;
}
private Polyline CreateRectangle(Point3d center, double width, double height)
{
double halfWidth = width / 2;
double halfHeight = height / 2;
Polyline rect = new Polyline();
rect.AddVertexAt(0, new Point2d(center.X - halfWidth, center.Y - halfHeight), 0, 0, 0);
rect.AddVertexAt(1, new Point2d(center.X + halfWidth, center.Y - halfHeight), 0, 0, 0);
rect.AddVertexAt(2, new Point2d(center.X + halfWidth, center.Y + halfHeight), 0, 0, 0);
rect.AddVertexAt(3, new Point2d(center.X - halfWidth, center.Y + halfHeight), 0, 0, 0);
rect.Closed = true;
return rect;
}
private Hatch CreateHatch(Polyline boundary, string patternName, double scale)
{
Hatch hatch = new Hatch();
hatch.SetHatchPattern(HatchPatternType.PreDefined, patternName);
hatch.PatternScale = scale;
hatch.Associative = true;
ObjectIdCollection boundaries = new ObjectIdCollection();
boundaries.Add(boundary.ObjectId);
hatch.AppendLoop(HatchLoopTypes.Outermost, boundaries);
return hatch;
}
private void AddToModelSpace(Transaction tr, Database db, Entity entity)
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
btr.AppendEntity(entity);
tr.AddNewlyCreatedDBObject(entity, true);
}
}
}
参数设置窗口界面显示不完整比例失衡
最新发布