using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
namespace BeamSectionPlugin
{
public class BeamSectionDrawer
{
private static BeamSettings settings = new BeamSettings();
private static readonly HashSet<string> loadedDatabases = new HashSet<string>();
private static Point3d? lastBeamEnd = null;
private static double? lastSlabZ = null;
[CommandMethod("DB")]
public void DrawBeamSection()
{
Document doc = AcadApp.DocumentManager.MdiActiveDocument;
if (doc == null) return;
Editor ed = doc.Editor;
Database db = doc.Database;
// 加载设置窗体
DialogResult dialogResult;
using (var form = new SettingsForm(settings))
{
dialogResult = AcadApp.ShowModalDialog(form);
}
if (dialogResult != DialogResult.OK) return;
// 保存原始系统变量设置
int oldOrthoMode = Convert.ToInt32(AcadApp.GetSystemVariable("ORTHOMODE"));
int oldPolarMode = Convert.ToInt32(AcadApp.GetSystemVariable("POLARMODE"));
int oldPolarAddMode = Convert.ToInt32(AcadApp.GetSystemVariable("POLARADDANG"));
try
{
// 启用正交模式和极轴追踪
AcadApp.SetSystemVariable("ORTHOMODE", 1);
AcadApp.SetSystemVariable("POLARMODE", 1); // 启用极轴追踪
AcadApp.SetSystemVariable("POLARADDANG", 90); // 设置90度增量角
// 重置连续绘制状态
lastBeamEnd = null;
lastSlabZ = null;
while (true)
{
try
{
Point3d firstPoint;
// 步骤1: 获取梁的第一点
if (lastBeamEnd.HasValue)
{
string continuePrompt = "\n请点击梁的第一点 (或按回车从上一端点继续): ";
PromptPointOptions firstPointOpts = new PromptPointOptions(continuePrompt);
firstPointOpts.AllowNone = true;
PromptPointResult firstPointRes = ed.GetPoint(firstPointOpts);
if (firstPointRes.Status == PromptStatus.None)
{
// 用户按回车,使用上一端点
firstPoint = lastBeamEnd.Value;
}
else if (firstPointRes.Status == PromptStatus.OK)
{
firstPoint = firstPointRes.Value;
}
else
{
return; // 用户取消
}
}
else
{
PromptPointResult firstPointRes = ed.GetPoint("\n请点击梁的第一点: ");
if (firstPointRes.Status != PromptStatus.OK) return;
firstPoint = firstPointRes.Value;
}
// 步骤2: 获取梁的第二点
Point3d secondPoint;
if (!lastBeamEnd.HasValue) // 第一次绘制
{
PromptPointResult secondPointRes = ed.GetPoint("\n请点击梁的第二点: ");
if (secondPointRes.Status != PromptStatus.OK) return;
secondPoint = secondPointRes.Value;
}
else // 连续绘制
{
PromptPointOptions secondPointOpts = new PromptPointOptions("\n请点击梁的第二点[板厚(A)升降板(S)]: ");
secondPointOpts.Keywords.Add("A");
secondPointOpts.Keywords.Add("S");
secondPointOpts.AllowNone = true;
secondPointOpts.UseBasePoint = true;
secondPointOpts.BasePoint = firstPoint;
secondPointOpts.UseDashedLine = true;
PromptPointResult secondPointRes = ed.GetPoint(secondPointOpts);
while (secondPointRes.Status == PromptStatus.Keyword)
{
if (secondPointRes.StringResult == "A")
{
PromptDoubleOptions pdo = new PromptDoubleOptions("\n输入板厚(mm)<" + settings.SlabThickness.ToString() + ">: ");
pdo.DefaultValue = settings.SlabThickness;
pdo.UseDefaultValue = true;
PromptDoubleResult slabThicknessRes = ed.GetDouble(pdo);
if (slabThicknessRes.Status != PromptStatus.OK) return;
settings.SlabThickness = slabThicknessRes.Value;
}
else if (secondPointRes.StringResult == "S")
{
PromptDoubleOptions pdo = new PromptDoubleOptions("\n请输入升降板高度(升板为正数,降板为负数)mm<" + settings.SlabHeightOffset.ToString() + ">: ");
pdo.DefaultValue = settings.SlabHeightOffset;
pdo.UseDefaultValue = true;
PromptDoubleResult slabHeightRes = ed.GetDouble(pdo);
if (slabHeightRes.Status != PromptStatus.OK) return;
settings.SlabHeightOffset = slabHeightRes.Value;
}
secondPointRes = ed.GetPoint(secondPointOpts);
}
if (secondPointRes.Status != PromptStatus.OK) return;
secondPoint = secondPointRes.Value;
}
// 确保两点不在同一位置
if (firstPoint.DistanceTo(secondPoint) < 0.001)
{
ed.WriteMessage("\n错误: 两点位置相同,请重新选择");
continue;
}
// 步骤3: 获取梁高
PromptDoubleOptions heightOpts = new PromptDoubleOptions("\n请输入梁高(mm)<" + settings.BeamHeight.ToString() + ">: ");
heightOpts.DefaultValue = settings.BeamHeight;
heightOpts.UseDefaultValue = true;
heightOpts.AllowNegative = false;
heightOpts.AllowZero = false;
PromptDoubleResult beamHeightRes = ed.GetDouble(heightOpts);
if (beamHeightRes.Status != PromptStatus.OK) return;
double beamHeight = beamHeightRes.Value;
settings.BeamHeight = beamHeight;
// 计算板底高度
double slabZ = firstPoint.Z + beamHeight + settings.SlabThickness + settings.SlabHeightOffset;
// 处理连续绘制时的板底高度变化
if (lastSlabZ.HasValue && Math.Abs(slabZ - lastSlabZ.Value) > 0.001)
{
// 绘制升降板竖线
DrawVerticalLine(db, lastBeamEnd.Value, lastSlabZ.Value, slabZ);
}
// 预加载所需块
LoadSupportBlocks(db, new[] {
"ScaffoldPole梁侧模",
"ScaffoldPole断面木方",
"ScaffoldPole断面方钢",
"ScaffoldPole横向龙骨"
});
// 步骤4: 绘制梁侧模
if (settings.DrawBeamFormwork)
DrawBeamFormwork(db, firstPoint, secondPoint, beamHeight);
// 步骤5: 绘制板底线
DrawSlabLine(db, firstPoint, secondPoint, beamHeight);
// 步骤6: 如果是连续绘制,绘制板下龙骨
if (lastBeamEnd.HasValue && settings.DrawSlabSupport)
{
DrawSlabSupport(db, firstPoint, secondPoint, beamHeight);
}
// 更新连续绘制状态
lastBeamEnd = secondPoint;
lastSlabZ = slabZ;
}
catch (System.Exception ex)
{
ed.WriteMessage($"\n错误: {ex.Message}\n{ex.StackTrace}");
string dbKey = db.Filename ?? db.GetHashCode().ToString();
loadedDatabases.Remove(dbKey);
}
}
}
finally
{
// 恢复原始系统变量设置
AcadApp.SetSystemVariable("ORTHOMODE", oldOrthoMode);
AcadApp.SetSystemVariable("POLARMODE", oldPolarMode);
AcadApp.SetSystemVariable("POLARADDANG", oldPolarAddMode);
}
}
private void DrawVerticalLine(Database db, Point3d startPoint, double startZ, double endZ)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
Line verticalLine = new Line(
new Point3d(startPoint.X, startPoint.Y, startZ),
new Point3d(startPoint.X, startPoint.Y, endZ)
);
btr.AppendEntity(verticalLine);
tr.AddNewlyCreatedDBObject(verticalLine, true);
tr.Commit();
}
}
private void DrawSlabLine(Database db, Point3d beamStart, Point3d beamEnd, double beamHeight)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
// 计算板底高度
double slabZ = beamStart.Z + beamHeight + settings.SlabThickness + settings.SlabHeightOffset;
Line slabLine = new Line(
new Point3d(beamStart.X, beamStart.Y, slabZ),
new Point3d(beamEnd.X, beamEnd.Y, slabZ)
);
btr.AppendEntity(slabLine);
tr.AddNewlyCreatedDBObject(slabLine, true);
tr.Commit();
}
}
private void LoadSupportBlocks(Database db, IEnumerable<string> requiredBlocks)
{
string dbKey = db.Filename ?? db.GetHashCode().ToString();
if (loadedDatabases.Contains(dbKey))
return;
// 1. 尝试加载合并的块文件
string blockFilePath = FindBlockFile();
if (!string.IsNullOrEmpty(blockFilePath))
{
using (Database sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(blockFilePath, FileOpenMode.OpenForReadAndAllShare, false, null);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
foreach (string blockName in requiredBlocks)
{
if (!bt.Has(blockName))
{
// 复制块定义
db.Insert(blockName, sourceDb, true);
}
}
tr.Commit();
}
}
loadedDatabases.Add(dbKey);
return;
}
// 2. 如果找不到合并文件,尝试加载单个块文件
string currentDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string blockDir = Path.Combine(currentDir, "ScaffoldBlocks");
if (!Directory.Exists(blockDir))
{
// 尝试在父目录中查找
blockDir = Path.Combine(Directory.GetParent(currentDir).FullName, "ScaffoldBlocks");
if (!Directory.Exists(blockDir))
{
loadedDatabases.Add(dbKey);
throw new FileNotFoundException("支撑块定义文件未找到,请确认ScaffoldBlocks目录存在");
}
}
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
foreach (string blockName in requiredBlocks)
{
if (bt.Has(blockName)) continue;
string blockFile = Path.Combine(blockDir, blockName + ".dwg");
if (!File.Exists(blockFile))
{
throw new FileNotFoundException($"找不到图块文件: {blockFile}");
}
using (Database sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(blockFile, FileOpenMode.OpenForReadAndAllShare, false, null);
db.Insert(blockName, sourceDb, true);
}
}
tr.Commit();
}
loadedDatabases.Add(dbKey);
}
private string FindBlockFile()
{
string currentDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
// 1. 检查ScaffoldBlocks子目录
string blockFile = Path.Combine(currentDir, "ScaffoldBlocks", "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
// 2. 检查当前目录
blockFile = Path.Combine(currentDir, "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
// 3. 安全获取AutoCAD支持路径
string acadPaths = "";
try
{
if (AcadApp.MainWindow != null)
{
object supportVar = AcadApp.GetSystemVariable("SUPPORT");
if (supportVar != null) acadPaths = supportVar.ToString();
}
}
catch
{
acadPaths = "";
}
// 4. 检查所有支持路径
if (!string.IsNullOrEmpty(acadPaths))
{
char[] separators = new char[] { ';', ',' };
foreach (string path in acadPaths.Split(separators, StringSplitOptions.RemoveEmptyEntries))
{
try
{
// 检查路径根目录
blockFile = Path.Combine(path.Trim(), "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
// 检查路径下的ScaffoldBlocks子目录
blockFile = Path.Combine(path.Trim(), "ScaffoldBlocks", "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
}
catch { /* 忽略无效路径 */ }
}
}
// 5. 检查标准插件目录
string[] pluginPaths = new string[]
{
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"Autodesk", "ApplicationPlugins", "BeamSectionPlugin.bundle"),
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
"Autodesk", "ApplicationPlugins", "BeamSectionPlugin.bundle")
};
foreach (string pluginDir in pluginPaths)
{
try
{
// 检查插件目录
blockFile = Path.Combine(pluginDir, "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
// 检查插件目录下的ScaffoldBlocks子目录
blockFile = Path.Combine(pluginDir, "ScaffoldBlocks", "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
}
catch { /* 忽略异常 */ }
}
// 6. 最终检查程序集所在目录的子目录
try
{
blockFile = Path.Combine(currentDir, "Resources", "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
blockFile = Path.Combine(currentDir, "Resources", "ScaffoldBlocks", "ScaffoldBlocks.dwg");
if (File.Exists(blockFile)) return blockFile;
}
catch { }
return null;
}
private void DrawBeamFormwork(Database db, Point3d start, Point3d end, double beamHeight)
{
double length = start.DistanceTo(end);
double halfLength = length / 2;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
const string beamBlockName = "ScaffoldPole梁侧模";
if (!bt.Has(beamBlockName))
throw new InvalidOperationException($"找不到图块 '{beamBlockName}',请确认ScaffoldBlocks目录存在");
// 计算中点作为插入点
Point3d midPoint = new Point3d(
(start.X + end.X) / 2,
(start.Y + end.Y) / 2,
start.Z
);
BlockReference beamRef = new BlockReference(midPoint, bt[beamBlockName]);
btr.AppendEntity(beamRef);
tr.AddNewlyCreatedDBObject(beamRef, true);
// 计算调整后的梁高
double adjustedBeamHeight = beamHeight - settings.SlabThickness;
if (adjustedBeamHeight < 50) adjustedBeamHeight = 50;
// 设置动态块参数
bool leftDistanceSet = false;
bool rightDistanceSet = false;
bool beamHeightSet = false;
bool lBeamHeightSet = false;
bool mBeamHeightSet = false;
foreach (DynamicBlockReferenceProperty prop in beamRef.DynamicBlockReferencePropertyCollection)
{
string propName = prop.PropertyName.ToLower();
if (propName.Contains("左侧") || propName.Contains("左距离"))
{
prop.Value = settings.BeamWidth / 2;
leftDistanceSet = true;
}
else if (propName.Contains("右侧") || propName.Contains("右距离"))
{
prop.Value = settings.BeamWidth / 2;
rightDistanceSet = true;
}
else if (propName.Contains("梁高") && !propName.Contains("l梁高") && !propName.Contains("m梁高"))
{
prop.Value = adjustedBeamHeight;
beamHeightSet = true;
}
else if (propName.Contains("l梁高"))
{
prop.Value = adjustedBeamHeight;
lBeamHeightSet = true;
}
else if (propName.Contains("m梁高"))
{
prop.Value = adjustedBeamHeight;
mBeamHeightSet = true;
}
}
// 检查所有必要参数是否已设置
if (!leftDistanceSet || !rightDistanceSet || !beamHeightSet || !lBeamHeightSet || !mBeamHeightSet)
{
// 如果动态属性未设置,使用更可靠的方法
ed.WriteMessage("\n警告: 未找到所有动态属性,将使用替代方法设置块参数");
// 这里可以添加替代设置方法
}
// 旋转图块
Vector3d direction = end - start;
double angle = direction.GetAngleTo(Vector3d.XAxis);
beamRef.TransformBy(Matrix3d.Rotation(angle, Vector3d.ZAxis, midPoint));
tr.Commit();
}
}
private void DrawSlabSupport(Database db, Point3d beamStart, Point3d beamEnd, double beamHeight)
{
if (!settings.DrawSlabSupport) return;
Vector3d beamDirection = (beamEnd - beamStart).GetNormal();
double beamLength = beamStart.DistanceTo(beamEnd);
// 计算板底位置
double slabZOffset = beamHeight + settings.SlabThickness + settings.SlabHeightOffset;
Point3d slabStart = new Point3d(beamStart.X, beamStart.Y, beamStart.Z + slabZOffset);
Point3d slabEnd = new Point3d(beamEnd.X, beamEnd.Y, beamEnd.Z + slabZOffset);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
if (settings.SlabMainDirection == "横向")
{
// 根据材料选择图块
string blockName = settings.SlabSecondaryMaterial.Contains("方钢") ?
"ScaffoldPole断面方钢" :
"ScaffoldPole断面木方";
if (!bt.Has(blockName))
throw new InvalidOperationException($"找不到图块 '{blockName}',请确认ScaffoldBlocks目录存在");
// 计算阵列数量和间距
int arrayCount = Math.Max(2, (int)Math.Ceiling(beamLength / settings.SlabSecondarySpacing));
double spacing = beamLength / (arrayCount - 1);
for (int i = 0; i < arrayCount; i++)
{
Point3d position = slabStart + (beamDirection * (i * spacing));
BlockReference supportRef = new BlockReference(position, bt[blockName]);
btr.AppendEntity(supportRef);
tr.AddNewlyCreatedDBObject(supportRef, true);
// 设置材料尺寸
foreach (DynamicBlockReferenceProperty prop in supportRef.DynamicBlockReferencePropertyCollection)
{
string propName = prop.PropertyName.ToLower();
if (propName.Contains("宽度"))
{
prop.Value = settings.SlabSecondaryWidth;
}
else if (propName.Contains("高度"))
{
prop.Value = settings.SlabSecondaryHeight;
}
}
// 根据方向决定是否旋转
double angle = 0;
if (settings.SlabMainDirection == "横向")
{
// 横向方向 - 无需旋转
angle = 0;
}
else
{
// 纵向方向 - 旋转90度
angle = Math.PI / 2;
}
supportRef.TransformBy(Matrix3d.Rotation(angle, Vector3d.ZAxis, position));
}
}
else
{
// 纵向龙骨:单根横向龙骨
const string slabBlockName = "ScaffoldPole横向龙骨";
if (!bt.Has(slabBlockName))
throw new InvalidOperationException($"找不到图块 '{slabBlockName}',请确认ScaffoldBlocks目录存在");
Point3d center = new Point3d(
(slabStart.X + slabEnd.X) / 2,
(slabStart.Y + slabEnd.Y) / 2,
slabStart.Z
);
BlockReference supportRef = new BlockReference(center, bt[slabBlockName]);
btr.AppendEntity(supportRef);
tr.AddNewlyCreatedDBObject(supportRef, true);
// 设置长度属性和尺寸
foreach (DynamicBlockReferenceProperty prop in supportRef.DynamicBlockReferencePropertyCollection)
{
string propName = prop.PropertyName.ToLower();
if (propName.Contains("长度"))
{
prop.Value = beamLength;
}
else if (propName.Contains("次龙骨宽"))
{
prop.Value = settings.SlabSecondaryWidth;
}
else if (propName.Contains("次龙骨高"))
{
prop.Value = settings.SlabSecondaryHeight;
}
}
// 旋转方向
Vector3d dir = beamEnd - beamStart;
double angle = dir.GetAngleTo(Vector3d.XAxis);
supportRef.TransformBy(Matrix3d.Rotation(angle, Vector3d.ZAxis, center));
}
tr.Commit();
}
}
}
public class BeamSettings
{
// 梁参数
public bool DrawBeamFormwork { get; set; } = true;
public bool DrawBeamSupport { get; set; } = true;
public string BeamMainDirection { get; set; } = "横向";
public double BeamExtension { get; set; } = 50;
public double BeamWidth { get; set; } = 300; // 梁宽参数
public double BeamHeight { get; set; } = 700; // 梁高参数
public string BeamMainMaterial { get; set; } = "100方钢";
public string BeamSecondaryMaterial { get; set; } = "50木方";
public double BeamSecondarySpacing { get; set; } = 100;
public double BeamSecondaryHeight { get; set; } = 90;
public double BeamSecondaryWidth { get; set; } = 40;
// 板参数
public double SlabThickness { get; set; } = 250;
public bool DrawSlabSupport { get; set; } = true;
public string SlabMainDirection { get; set; } = "横向";
public bool KeepSupport { get; set; } = true;
public string SlabMainMaterial { get; set; } = "100方钢";
public string SlabSecondaryMaterial { get; set; } = "3木方";
public double SlabSecondarySpacing { get; set; } = 250;
public double SlabSecondaryHeight { get; set; } = 90;
public double SlabSecondaryWidth { get; set; } = 40;
public double SlabHeightOffset { get; set; } = 0;
}
public class SettingsForm : Form
{
private BeamSettings settings;
private Dictionary<string, Control> controls = new Dictionary<string, Control>();
public SettingsForm(BeamSettings settings)
{
this.settings = settings;
InitializeForm();
this.FormClosing += SettingsForm_FormClosing;
}
private void SettingsForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.OK)
{
SaveFormData();
}
}
private void SaveFormData()
{
// 梁侧模设置
settings.DrawBeamFormwork = ((RadioButton)controls["rbBeamFormworkYes"]).Checked;
settings.DrawBeamSupport = ((RadioButton)controls["rbBeamSupportYes"]).Checked;
settings.BeamMainDirection = ((RadioButton)controls["rbBeamHorizontal"]).Checked ? "横向" : "纵向";
settings.BeamExtension = double.Parse(((TextBox)controls["tbBeamExtension"]).Text);
settings.BeamMainMaterial = ((ComboBox)controls["cbBeamMainMaterial"]).Text;
settings.BeamSecondaryMaterial = ((ComboBox)controls["cbBeamSecondaryMaterial"]).Text;
settings.BeamSecondarySpacing = double.Parse(((TextBox)controls["tbBeamSecondarySpacing"]).Text);
settings.BeamSecondaryHeight = double.Parse(((TextBox)controls["tbBeamSecondaryHeight"]).Text);
settings.BeamSecondaryWidth = double.Parse(((TextBox)controls["tbBeamSecondaryWidth"]).Text);
// 板设置
settings.SlabThickness = double.Parse(((TextBox)controls["tbSlabThickness"]).Text);
settings.DrawSlabSupport = ((RadioButton)controls["rbSlabSupportYes"]).Checked;
settings.SlabMainDirection = ((RadioButton)controls["rbSlabHorizontal"]).Checked ? "横向" : "纵向";
settings.SlabMainMaterial = ((ComboBox)controls["cbSlabMainMaterial"]).Text;
settings.SlabSecondaryMaterial = ((ComboBox)controls["cbSlabSecondaryMaterial"]).Text;
settings.SlabSecondarySpacing = double.Parse(((TextBox)controls["tbSlabSpacing"]).Text);
settings.SlabSecondaryHeight = double.Parse(((TextBox)controls["tbSlabSecondaryHeight"]).Text);
settings.SlabSecondaryWidth = double.Parse(((TextBox)controls["tbSlabSecondaryWidth"]).Text);
}
private void InitializeForm()
{
this.Text = "梁板剖面绘制参数设置";
this.Size = new System.Drawing.Size(450, 650); // 高度减少
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.StartPosition = FormStartPosition.CenterScreen;
TabControl tabControl = new TabControl();
tabControl.Dock = DockStyle.Fill;
// 梁下龙骨选项卡
TabPage beamTab = new TabPage("梁下龙骨");
InitializeBeamTab(beamTab);
// 板下龙骨选项卡
TabPage slabTab = new TabPage("板下龙骨");
InitializeSlabTab(slabTab);
tabControl.TabPages.Add(beamTab);
tabControl.TabPages.Add(slabTab);
// 按钮面板
Panel buttonPanel = new Panel();
buttonPanel.Dock = DockStyle.Bottom;
buttonPanel.Height = 50;
Button okButton = new Button();
okButton.Text = "开始绘制";
okButton.DialogResult = DialogResult.OK;
okButton.Location = new System.Drawing.Point(120, 10);
okButton.Size = new System.Drawing.Size(90, 30);
Button cancelButton = new Button();
cancelButton.Text = "取消";
cancelButton.DialogResult = DialogResult.Cancel;
cancelButton.Location = new System.Drawing.Point(240, 10);
cancelButton.Size = new System.Drawing.Size(90, 30);
buttonPanel.Controls.Add(okButton);
buttonPanel.Controls.Add(cancelButton);
this.Controls.Add(tabControl);
this.Controls.Add(buttonPanel);
}
private void InitializeBeamTab(TabPage tab)
{
tab.Controls.Clear();
tab.AutoScroll = true;
int yPos = 20;
// 绘制梁侧模
GroupBox gbBeamFormwork = new GroupBox();
gbBeamFormwork.Text = "绘制梁侧模";
gbBeamFormwork.Location = new System.Drawing.Point(20, yPos);
gbBeamFormwork.Size = new System.Drawing.Size(380, 50);
RadioButton rbBeamFormworkYes = new RadioButton();
rbBeamFormworkYes.Text = "是";
rbBeamFormworkYes.Checked = settings.DrawBeamFormwork;
rbBeamFormworkYes.Location = new System.Drawing.Point(30, 20);
controls.Add("rbBeamFormworkYes", rbBeamFormworkYes);
RadioButton rbBeamFormworkNo = new RadioButton();
rbBeamFormworkNo.Text = "否";
rbBeamFormworkNo.Checked = !settings.DrawBeamFormwork;
rbBeamFormworkNo.Location = new System.Drawing.Point(200, 20);
controls.Add("rbBeamFormworkNo", rbBeamFormworkNo);
gbBeamFormwork.Controls.Add(rbBeamFormworkYes);
gbBeamFormwork.Controls.Add(rbBeamFormworkNo);
tab.Controls.Add(gbBeamFormwork);
yPos += 60;
// 绘制梁龙骨
GroupBox gbBeamSupport = new GroupBox();
gbBeamSupport.Text = "绘制梁龙骨";
gbBeamSupport.Location = new System.Drawing.Point(20, yPos);
gbBeamSupport.Size = new System.Drawing.Size(380, 50);
RadioButton rbBeamSupportYes = new RadioButton();
rbBeamSupportYes.Text = "是";
rbBeamSupportYes.Checked = settings.DrawBeamSupport;
rbBeamSupportYes.Location = new System.Drawing.Point(30, 20);
controls.Add("rbBeamSupportYes", rbBeamSupportYes);
RadioButton rbBeamSupportNo = new RadioButton();
rbBeamSupportNo.Text = "否";
rbBeamSupportNo.Checked = !settings.DrawBeamSupport;
rbBeamSupportNo.Location = new System.Drawing.Point(200, 20);
controls.Add("rbBeamSupportNo", rbBeamSupportNo);
gbBeamSupport.Controls.Add(rbBeamSupportYes);
gbBeamSupport.Controls.Add(rbBeamSupportNo);
tab.Controls.Add(gbBeamSupport);
yPos += 60;
// 主龙骨方向
GroupBox gbBeamDirection = new GroupBox();
gbBeamDirection.Text = "主龙骨方向";
gbBeamDirection.Location = new System.Drawing.Point(20, yPos);
gbBeamDirection.Size = new System.Drawing.Size(380, 100);
RadioButton rbBeamHorizontal = new RadioButton();
rbBeamHorizontal.Text = "横向";
rbBeamHorizontal.Checked = (settings.BeamMainDirection == "横向");
rbBeamHorizontal.Location = new System.Drawing.Point(30, 20);
controls.Add("rbBeamHorizontal", rbBeamHorizontal);
RadioButton rbBeamVertical = new RadioButton();
rbBeamVertical.Text = "纵向";
rbBeamVertical.Checked = (settings.BeamMainDirection == "纵向");
rbBeamVertical.Location = new System.Drawing.Point(200, 20);
controls.Add("rbBeamVertical", rbBeamVertical);
Label lblBeamExtension = new Label();
lblBeamExtension.Text = "横龙骨延伸宽度(mm):";
lblBeamExtension.Location = new System.Drawing.Point(30, 60);
lblBeamExtension.AutoSize = true;
TextBox tbBeamExtension = new TextBox();
tbBeamExtension.Text = settings.BeamExtension.ToString();
tbBeamExtension.Location = new System.Drawing.Point(200, 55);
tbBeamExtension.Width = 100;
controls.Add("tbBeamExtension", tbBeamExtension);
gbBeamDirection.Controls.Add(rbBeamHorizontal);
gbBeamDirection.Controls.Add(rbBeamVertical);
gbBeamDirection.Controls.Add(lblBeamExtension);
gbBeamDirection.Controls.Add(tbBeamExtension);
tab.Controls.Add(gbBeamDirection);
yPos += 110;
// 材料设置
GroupBox gbBeamMaterial = new GroupBox();
gbBeamMaterial.Text = "材料设置";
gbBeamMaterial.Location = new System.Drawing.Point(20, yPos);
gbBeamMaterial.Size = new System.Drawing.Size(380, 250); // 高度减少
Label lblBeamMainMaterial = new Label();
lblBeamMainMaterial.Text = "主龙骨:";
lblBeamMainMaterial.Location = new System.Drawing.Point(30, 30);
lblBeamMainMaterial.AutoSize = true;
ComboBox cbBeamMainMaterial = new ComboBox();
cbBeamMainMaterial.Items.AddRange(new object[] { "3木方", "5大方", "50钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "10#槽钢" });
cbBeamMainMaterial.Text = settings.BeamMainMaterial;
cbBeamMainMaterial.Location = new System.Drawing.Point(220, 25);
cbBeamMainMaterial.Width = 130;
controls.Add("cbBeamMainMaterial", cbBeamMainMaterial);
Label lblBeamSecondaryMaterial = new Label();
lblBeamSecondaryMaterial.Text = "次龙骨:";
lblBeamSecondaryMaterial.Location = new System.Drawing.Point(30, 70);
lblBeamSecondaryMaterial.AutoSize = true;
ComboBox cbBeamSecondaryMaterial = new ComboBox();
cbBeamSecondaryMaterial.Items.AddRange(new object[] { "3木方", "5大方", "50钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "10#槽钢" });
cbBeamSecondaryMaterial.Text = settings.BeamSecondaryMaterial;
cbBeamSecondaryMaterial.Location = new System.Drawing.Point(220, 65);
cbBeamSecondaryMaterial.Width = 130;
controls.Add("cbBeamSecondaryMaterial", cbBeamSecondaryMaterial);
Label lblBeamSecondarySpacing = new Label();
lblBeamSecondarySpacing.Text = "次龙骨间距(mm):";
lblBeamSecondarySpacing.Location = new System.Drawing.Point(30, 110);
lblBeamSecondarySpacing.AutoSize = true;
TextBox tbBeamSecondarySpacing = new TextBox();
tbBeamSecondarySpacing.Text = settings.BeamSecondarySpacing.ToString();
tbBeamSecondarySpacing.Location = new System.Drawing.Point(220, 105);
tbBeamSecondarySpacing.Width = 130;
controls.Add("tbBeamSecondarySpacing", tbBeamSecondarySpacing);
Label lblBeamSecondaryWidth = new Label();
lblBeamSecondaryWidth.Text = "次龙骨宽(mm):";
lblBeamSecondaryWidth.Location = new System.Drawing.Point(30, 150);
lblBeamSecondaryWidth.AutoSize = true;
TextBox tbBeamSecondaryWidth = new TextBox();
tbBeamSecondaryWidth.Text = settings.BeamSecondaryWidth.ToString();
tbBeamSecondaryWidth.Location = new System.Drawing.Point(220, 145);
tbBeamSecondaryWidth.Width = 130;
controls.Add("tbBeamSecondaryWidth", tbBeamSecondaryWidth);
Label lblBeamSecondaryHeight = new Label();
lblBeamSecondaryHeight.Text = "次龙骨高(mm):";
lblBeamSecondaryHeight.Location = new System.Drawing.Point(30, 190);
lblBeamSecondaryHeight.AutoSize = true;
TextBox tbBeamSecondaryHeight = new TextBox();
tbBeamSecondaryHeight.Text = settings.BeamSecondaryHeight.ToString();
tbBeamSecondaryHeight.Location = new System.Drawing.Point(220, 185);
tbBeamSecondaryHeight.Width = 130;
controls.Add("tbBeamSecondaryHeight", tbBeamSecondaryHeight);
gbBeamMaterial.Controls.Add(lblBeamMainMaterial);
gbBeamMaterial.Controls.Add(cbBeamMainMaterial);
gbBeamMaterial.Controls.Add(lblBeamSecondaryMaterial);
gbBeamMaterial.Controls.Add(cbBeamSecondaryMaterial);
gbBeamMaterial.Controls.Add(lblBeamSecondarySpacing);
gbBeamMaterial.Controls.Add(tbBeamSecondarySpacing);
gbBeamMaterial.Controls.Add(lblBeamSecondaryWidth);
gbBeamMaterial.Controls.Add(tbBeamSecondaryWidth);
gbBeamMaterial.Controls.Add(lblBeamSecondaryHeight);
gbBeamMaterial.Controls.Add(tbBeamSecondaryHeight);
tab.Controls.Add(gbBeamMaterial);
}
private void InitializeSlabTab(TabPage tab)
{
tab.Controls.Clear();
tab.AutoScroll = true;
int yPos = 20;
// 默认板厚
GroupBox gbSlabThickness = new GroupBox();
gbSlabThickness.Text = "板厚设置";
gbSlabThickness.Location = new System.Drawing.Point(20, yPos);
gbSlabThickness.Size = new System.Drawing.Size(380, 60);
TextBox tbSlabThickness = new TextBox();
tbSlabThickness.Text = settings.SlabThickness.ToString();
tbSlabThickness.Location = new System.Drawing.Point(220, 20);
tbSlabThickness.Width = 130;
controls.Add("tbSlabThickness", tbSlabThickness);
gbSlabThickness.Controls.Add(new Label()
{
Text = "默认板厚(mm):",
Location = new System.Drawing.Point(30, 25),
AutoSize = true
});
gbSlabThickness.Controls.Add(tbSlabThickness);
tab.Controls.Add(gbSlabThickness);
yPos += 70;
// 绘制板龙骨
GroupBox gbDrawSlabSupport = new GroupBox();
gbDrawSlabSupport.Text = "绘制板龙骨";
gbDrawSlabSupport.Location = new System.Drawing.Point(20, yPos);
gbDrawSlabSupport.Size = new System.Drawing.Size(380, 60);
RadioButton rbSlabSupportYes = new RadioButton();
rbSlabSupportYes.Text = "是";
rbSlabSupportYes.Checked = settings.DrawSlabSupport;
rbSlabSupportYes.Location = new System.Drawing.Point(30, 25);
controls.Add("rbSlabSupportYes", rbSlabSupportYes);
RadioButton rbSlabSupportNo = new RadioButton();
rbSlabSupportNo.Text = "否";
rbSlabSupportNo.Checked = !settings.DrawSlabSupport;
rbSlabSupportNo.Location = new System.Drawing.Point(200, 25);
controls.Add("rbSlabSupportNo", rbSlabSupportNo);
gbDrawSlabSupport.Controls.Add(rbSlabSupportYes);
gbDrawSlabSupport.Controls.Add(rbSlabSupportNo);
tab.Controls.Add(gbDrawSlabSupport);
yPos += 70;
// 主龙骨方向
GroupBox gbSlabDirection = new GroupBox();
gbSlabDirection.Text = "主龙骨方向";
gbSlabDirection.Location = new System.Drawing.Point(20, yPos);
gbSlabDirection.Size = new System.Drawing.Size(380, 60);
RadioButton rbSlabHorizontal = new RadioButton();
rbSlabHorizontal.Text = "横向";
rbSlabHorizontal.Checked = (settings.SlabMainDirection == "横向");
rbSlabHorizontal.Location = new System.Drawing.Point(30, 25);
controls.Add("rbSlabHorizontal", rbSlabHorizontal);
RadioButton rbSlabVertical = new RadioButton();
rbSlabVertical.Text = "纵向";
rbSlabVertical.Checked = (settings.SlabMainDirection == "纵向");
rbSlabVertical.Location = new System.Drawing.Point(200, 25);
controls.Add("rbSlabVertical", rbSlabVertical);
gbSlabDirection.Controls.Add(rbSlabHorizontal);
gbSlabDirection.Controls.Add(rbSlabVertical);
tab.Controls.Add(gbSlabDirection);
yPos += 70;
// 次龙骨设置
GroupBox gbSlabSecondary = new GroupBox();
gbSlabSecondary.Text = "龙骨设置";
gbSlabSecondary.Location = new System.Drawing.Point(20, yPos);
gbSlabSecondary.Size = new System.Drawing.Size(380, 210);
Label lblSlabMainMaterial = new Label();
lblSlabMainMaterial.Text = "主龙骨材料:";
lblSlabMainMaterial.Location = new System.Drawing.Point(30, 30);
lblSlabMainMaterial.AutoSize = true;
ComboBox cbSlabMainMaterial = new ComboBox();
cbSlabMainMaterial.Items.AddRange(new object[] { "3木方", "5大方", "极钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "10#槽钢" });
cbSlabMainMaterial.Text = settings.SlabMainMaterial;
cbSlabMainMaterial.Location = new System.Drawing.Point(220, 25);
cbSlabMainMaterial.Width = 130;
controls.Add("cbSlabMainMaterial", cbSlabMainMaterial);
Label lblSlabSecondaryMaterial = new Label();
lblSlabSecondaryMaterial.Text = "次龙骨材料:";
lblSlabSecondaryMaterial.Location = new System.Drawing.Point(30, 70);
lblSlabSecondaryMaterial.AutoSize = true;
ComboBox cbSlabSecondaryMaterial = new ComboBox();
cbSlabSecondaryMaterial.Items.AddRange(new object[] { "3木方", "5大方", "50钢包木", "48钢管", "40方钢", "50方钢", "100方钢", "8#槽钢", "10#槽钢" });
cbSlabSecondaryMaterial.Text = settings.SlabSecondaryMaterial;
cbSlabSecondaryMaterial.Location = new System.Drawing.Point(220, 65);
cbSlabSecondaryMaterial.Width = 130;
controls.Add("cbSlabSecondaryMaterial", cbSlabSecondaryMaterial);
Label lblSlabSpacing = new Label();
lblSlabSpacing.Text = "次龙骨间距(mm):";
lblSlabSpacing.Location = new System.Drawing.Point(30, 110);
lblSlabSpacing.AutoSize = true;
TextBox tbSlabSpacing = new TextBox();
tbSlabSpacing.Text = settings.SlabSecondarySpacing.ToString();
tbSlabSpacing.Location = new System.Drawing.Point(220, 105);
tbSlabSpacing.Width = 130;
controls.Add("tbSlabSpacing", tbSlabSpacing);
Label lblSlabSecondaryWidth = new Label();
lblSlabSecondaryWidth.Text = "次龙骨宽(mm):";
lblSlabSecondaryWidth.Location = new System.Drawing.Point(30, 150);
lblSlabSecondaryWidth.AutoSize = true;
TextBox tbSlabSecondaryWidth = new TextBox();
tbSlabSecondaryWidth.Text = settings.SlabSecondaryWidth.ToString();
tbSlabSecondaryWidth.Location = new System.Drawing.Point(220, 145);
tbSlabSecondaryWidth.Width = 130;
controls.Add("tbSlabSecondaryWidth", tbSlabSecondaryWidth);
Label lblSlabSecondaryHeight = new Label();
lblSlabSecondaryHeight.Text = "次龙骨高(mm):";
lblSlabSecondaryHeight.Location = new System.Drawing.Point(30, 190);
lblSlabSecondaryHeight.AutoSize = true;
TextBox tbSlabSecondaryHeight = new TextBox();
tbSlabSecondaryHeight.Text = settings.SlabSecondaryHeight.ToString();
tbSlabSecondaryHeight.Location = new System.Drawing.Point(220, 185);
tbSlabSecondaryHeight.Width = 130;
controls.Add("tbSlabSecondaryHeight", tbSlabSecondaryHeight);
gbSlabSecondary.Controls.Add(lblSlabMainMaterial);
gbSlabSecondary.Controls.Add(cbSlabMainMaterial);
gbSlabSecondary.Controls.Add(lblSlabSecondaryMaterial);
gbSlabSecondary.Controls.Add(cbSlabSecondaryMaterial);
gbSlabSecondary.Controls.Add(lblSlabSpacing);
gbSlabSecondary.Controls.Add(tbSlabSpacing);
gbSlabSecondary.Controls.Add(lblSlabSecondaryWidth);
gbSlabSecondary.Controls.Add(tbSlabSecondaryWidth);
gbSlabSecondary.Controls.Add(lblSlabSecondaryHeight);
gbSlabSecondary.Controls.Add(tbSlabSecondaryHeight);
tab.Controls.Add(gbSlabSecondary);
}
}
}
CS0103当前上下文中不存在名称“ed”
修改一套完整代码