应用程序名称:InPlaceMembers
Revit 平台:结构
Revit 版本:2011.0
首次发布时间:9.0
编程语言:C#
技能水平:中等
类别:族
类型:ExternalCommand
主题:显示原地族实例属性。
摘要:
该示例演示了如何获取Revit当前文档中的原地家族实例及其属性。
类:
Autodesk.Revit.UI.IExternalCommand
Autodesk.Revit.DB.FamilyInstance
Autodesk.Revit.DB.Structure.AnalyticalModel
Autodesk.Revit.DB.Curve
项目文件:
Command.cs
该文件包含了一个实现了IExternalCommand的类Command,该类的功能是检索原地族实例属性的值并将数据发送到UI。
GraphicsData.cs
该文件包含了一个名为GraphicsData的类,该类的功能是存储AnalyticalModel的曲线点,并实现操作几何图形的一些功能,比如旋转、移动等。
GraphicsDataFactory.cs
该文件包含了一个名为GraphicsDataFactory的类,该类只有一个静态方法CreateGraphicsData来创建一个GraphicsData对象。
PictureBox3D.cs
该文件包含了一个名为PictureBox3D的类,该类的功能是画出保存在GraphicsData对象中的AnalyticalModel的几何曲线。
Properties.cs
该文件包含了一个名为Properties的类,该类保存FamilyInstance对象的所有属性值。
InPlaceMembersForm.cs
该文件包含了一个名为InPlaceMembersForm的类,该类继承自Form和IMessageFilter。它使用一个PictureBox3D来绘制AnalyticalModel的曲线,并使用一个PropertyGrid来显示所选FamilyInstance的属性。
描述:
该示例检索原地族实例的属性值,将原地族实例的 Analytical Model 画在一个 PictureBox 中,并在属性网格中显示其他属性。我们可以通过Curves属性获取AnalyticalModel的轮廓曲线。
指导步骤:
1. 打开或新建Revit项目,并确保至少有一个包含Analytical Model的原地族实例被放置。示例项目文件InPlaceMembers.rvt位于示例文件夹中。
2. 选择包含Analytical Model的原地族实例。
3. 运行命令。
4. 窗体将显示所选FamilyInstance的Analytical Model。可以通过按键旋转、移动和缩放几何形状:
- 旋转(左、右、上、下、PageUp、PageDown)
- 移动(S、W、A、D)
- 缩放(Home、End)。
源代码
完整的源代码请加入QQ群649037449,在群文件中下载RevitSDK.exe,解压后在文件夹中搜索本文中应用程序名称即可获得完整源码
GraphicsData.cs
//
// (C) Copyright 2003-2019 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB;
namespace Revit.SDK.Samples.InPlaceMembers.CS
{
/// <summary>
/// trigger when view data updated
/// </summary>
public delegate void UpdateViewDelegate();
/// <summary>
/// interface as the datasource of view, include nececessary members
/// </summary>
public interface IGraphicsData
{
/// <summary>
/// 2D lines
/// </summary>
/// <returns></returns>
List<PointF[]> PointCurves();
/// <summary>
/// view data update
/// </summary>
event UpdateViewDelegate UpdateViewEvent;
/// <summary>
/// region of 3D view data
/// </summary>
RectangleF Region
{
get;
}
}
/// <summary>
/// abstract class include general members
/// </summary>
public abstract class GraphicsDataBase:IGraphicsData
{
/// <summary>
///3D max point after transfered
/// </summary>
protected Autodesk.Revit.DB.XYZ m_transferedMax;
/// <summary>
///3D min point after transfered
/// </summary>
protected Autodesk.Revit.DB.XYZ m_transferedMin;
/// <summary>
/// origin max define
/// </summary>
protected Autodesk.Revit.DB.XYZ m_originMax = new Autodesk.Revit.DB.XYZ (double.MinValue, double.MinValue, double.MinValue);
/// <summary>
/// origin min define
/// </summary>
protected Autodesk.Revit.DB.XYZ m_originMin = new Autodesk.Revit.DB.XYZ (double.MaxValue, double.MaxValue, double.MaxValue);
/// <summary>
/// origin define
/// </summary>
protected double[,] m_origin = {{ 1.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 } };
/// <summary>
///minimum value of the region box's edge
/// </summary>
public const float MINEDGElENGTH = 1.0f;
/// <summary>
/// default angle when rotate around X,Y,Z axis
/// </summary>
public const double ROTATEANGLE = System.Math.PI / 90;
/// <summary>
/// update view event
/// </summary>
public virtual event UpdateViewDelegate UpdateViewEvent;
/// <summary>
/// constructor
/// </summary>
public GraphicsDataBase()
{
Initialize();
}
/// <summary>
/// initialize some member data
/// </summary>
protected virtual void Initialize()
{
double INITANGLE = Math.PI / 4;
RotateX(ref m_origin, INITANGLE);
RotateY(ref m_origin, INITANGLE);
m_transferedMax = new Autodesk.Revit.DB.XYZ (double.MinValue, double.MinValue, double.MinValue);
m_transferedMin = new Autodesk.Revit.DB.XYZ (double.MaxValue, double.MaxValue, double.MaxValue);
}
/// <summary>
/// trigger updata view event
/// </summary>
public virtual void UpdataData()
{
UpdateViewEvent();
}
/// <summary>
/// point curves function
/// </summary>
/// <returns>the points list of curves</returns>
public abstract List<PointF[]> PointCurves();
/// <summary>
/// rectangular region of 3D view data
/// </summary>
public RectangleF Region
{
get
{
float width = (float)(m_transferedMax.X - m_transferedMin.X);
float height = (float)(m_transferedMax.Y - m_transferedMin.Y);
float maxX = (width / 2);
float maxY = (height / 2);
float minX = -(width / 2);
float minY = -(height / 2);
if (width < 1)
{
width = 1;
}
if (height < 1)
{
height = 1;
}
RectangleF rec = new RectangleF(minX, minY, width, height);
return rec;
}
}
/// <summary>
/// rotate around Z axis with default angle
/// </summary>
/// <param name="direction">minus or positive angle</param>
public void RotateZ(bool direction)
{
double angle = ROTATEANGLE;
if (!direction)
{
angle = -ROTATEANGLE;
}
RotateZ(ref m_origin, angle);
UpdataData();
}
/// <summary>
/// rotate 3*3 matrix around Z axis
/// </summary>
/// <param name="origin">matrix to rotate</param>
/// <param name="angle"></param>
private void RotateZ(ref double[,] origin, double angle)
{
double sin = Math.Sin(angle);
double cos = Math.Cos(angle);
double[,] rotate = { { cos, sin, 0.0 }, { -sin, cos, 0.0 }, { 0.0, 0.0, 1.0 } };
origin = MatrixArith.MultiCross(m_origin, rotate);
}
/// <summary>
/// rotate around Y axis with default angle
/// </summary>
/// <param name="direction">minus or positive angle</param>
public void RotateY(bool direction)
{
double angle = ROTATEANGLE;
if (!direction)
{
angle = -ROTATEANGLE;
}
RotateY(ref m_origin, angle);
UpdataData();
}
/// <summary>
/// rotate 3*3 matrix around Y axis
/// </summary>
/// <param name="origin">matrix to rotate</param>
/// <param name="angle"></param>
private void RotateY(ref double[,] origin, double angle)
{
double sin = Math.Sin(angle);
double cos = Math.Cos(angle);
double[,] rotate = { { cos, 0.0, -sin }, { 0.0, 1.0, 0.0 }, { sin, 0.0, cos } };
origin = MatrixArith.MultiCross(m_origin, rotate);
}
/// <summary>
/// rotate around X axis with default angle
/// </summary>
/// <param name="direction">minus or positive angle</param>
public void RotateX(bool direction)
{
double angle = ROTATEANGLE;
if (!direction)
{
angle = -ROTATEANGLE;
}
RotateX(ref m_origin ,angle);
UpdataData();
}
/// <summary>
/// rotate 3*3 matrix around X axis
/// </summary>
/// <param name="origin">matrix to rotate</param>
/// <param name="angle"></param>
private void RotateX(ref double[,] origin, double angle)
{
double sin = Math.Sin(angle);
double cos = Math.Cos(angle);
double[,] rotate = { { 1.0, 0.0, 0.0 }, { 0.0, cos, sin }, { 0.0, -sin, cos } };
origin = MatrixArith.MultiCross(m_origin, rotate);
}
}
/// <summary>
/// datasource that can bind to PictureBox3D
/// </summary>
public class GraphicsData : GraphicsDataBase
{
List<List<XYZ>> m_originCurves;
List<List<XYZ>> m_transferedCurves;
List<PointF[]> m_curves2D;
/// <summary>
/// update view event
/// </summary>
public override event UpdateViewDelegate UpdateViewEvent;
/// <summary>
/// constructor to initialize member data
/// </summary>
public GraphicsData() : base()
{
m_originCurves = new List<List<XYZ>>();
m_transferedCurves = new List<List<XYZ>>();
m_curves2D = new List<PointF[]>();
}
/// <summary>
/// curves array
/// </summary>
/// <returns></returns>
public override List<PointF[]> PointCurves()
{
return m_curves2D;
}
/// <summary>
/// insert curves array into datasource
/// </summary>
/// <param name="points">points compose the curve</param>
public void InsertCurve(List<XYZ> points)
{
m_originCurves.Add(points);
foreach (Autodesk.Revit.DB.XYZ point in points)
{
m_originMin = UpdateMinRange(point);
m_originMax = UpdateMaxRange(point);
}
}
/// <summary>
/// update 3D view data
/// </summary>
public override void UpdataData()
{
m_transferedMin = TransferRotate(m_originMin);
m_transferedMax = TransferRotate(m_originMax);
m_transferedCurves.Clear();
m_curves2D.Clear();
foreach (List<XYZ> points in m_originCurves)
{
SynChroData(points);
}
if (null != UpdateViewEvent)
{
UpdateViewEvent();
}
}
/// <summary>
/// update 3D view curve data with origin data and transfer matrix
/// </summary>
/// <param name="points"></param>
private void SynChroData(List<XYZ> points)
{
int size = points.Count;
PointF[] points2D = new PointF[size];
List<XYZ> transferedPoints = new List<XYZ>();
for(int i = 0; i<size;i++)
{
Autodesk.Revit.DB.XYZ point = points[i];
Autodesk.Revit.DB.XYZ temp = TransferRotate(point);
Autodesk.Revit.DB.XYZ transferedPoint = TransferMove(temp);
points2D[i] = new PointF((float)transferedPoint.X, (float)transferedPoint.Y);
}
m_transferedCurves.Add(transferedPoints);
m_curves2D.Add(points2D);
}
private XYZ UpdateMaxRange(XYZ pnt)
{
return new XYZ(
pnt.X > m_originMax.X ? pnt.X : m_originMax.X,
pnt.Y > m_originMax.Y ? pnt.Y : m_originMax.Y,
pnt.Z > m_originMax.Z ? pnt.Z : m_originMax.Z);
}
private XYZ UpdateMinRange(XYZ pnt)
{
return new XYZ(
pnt.X < m_originMin.X ? pnt.X : m_originMin.X,
pnt.Y < m_originMin.Y ? pnt.Y : m_originMin.Y,
pnt.Z < m_originMin.Z ? pnt.Z : m_originMin.Z);
}
/// <summary>
/// rotate points with origion matrix
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
private Autodesk.Revit.DB.XYZ TransferRotate(Autodesk.Revit.DB.XYZ point)
{
double x = point.X;
double y = point.Y;
double z = point.Z;
return new XYZ(
x * m_origin[0, 0] + y * m_origin[0, 1] + z * m_origin[0, 2],
x * m_origin[1, 0] + y * m_origin[1, 1] + z * m_origin[1, 2],
x * m_origin[2, 0] + y * m_origin[2, 1] + z * m_origin[2, 2]);
}
/// <summary>
/// move the point so that the center of the curves in 3D view is origin
/// </summary>
/// <param name="point">points to be moved</param>
/// <returns>moved result</returns>
private Autodesk.Revit.DB.XYZ TransferMove(Autodesk.Revit.DB.XYZ point)
{
//transform the origin of the old coordinate system in the new coordinate system
return new XYZ(
point.X - (m_transferedMax.X + m_transferedMin.X) / 2,
point.Y - (m_transferedMax.Y + m_transferedMin.Y) / 2,
point.Z - (m_transferedMax.Z + m_transferedMin.Z) / 2);
}
}
/// <summary>
/// utility class provide arithmetic of matrix
/// </summary>
public class MatrixArith
{
/// <summary>
/// multiply cross two matrix
/// </summary>
/// <param name="m1">left matrix</param>
/// <param name="m2">right matrix</param>
/// <returns>result matrix</returns>
public static double[,] MultiCross(double[,] m1, double[,] m2)
{
double[,] result = new double[3, 3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3; k++)
{
result[i, j] += m1[i, k] * m2[k, j];
}
}
}
return result;
}
}
}
GraphicsDataFactory.cs
//
// (C) Copyright 2003-2019 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB;
using System.Reflection;
namespace Revit.SDK.Samples.InPlaceMembers.CS
{
/// <summary>
/// generate GraphicsData by given geometry object
/// </summary>
public class GraphicsDataFactory
{
/// <summary>
/// create GraphicsData of given AnalyticalModel3D
/// </summary>
/// <param name="model">AnalyticalModel3D contains geometry data</param>
/// <returns></returns>
public static GraphicsData CreateGraphicsData(AnalyticalModel model)
{
IList<Curve> curveList = model.GetCurves(AnalyticalCurveType.ActiveCurves);
if (curveList.Count > 0)
{
GraphicsData data = new GraphicsData();
IEnumerator<Curve> curves = curveList.GetEnumerator();
curves.Reset();
while (curves.MoveNext())
{
Curve curve = curves.Current as Curve;
try
{
List<XYZ> points = curve.Tessellate() as List<XYZ>;
data.InsertCurve(points);
}
catch
{
}
}
data.UpdataData();
return data;
}
else
{
throw new Exception("Can't get curves.");
}
}
}
}
Properties.cs
//
// (C) Copyright 2003-2019 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
using System.ComponentModel;
using Autodesk.Revit.DB;
using System;
namespace Revit.SDK.Samples.InPlaceMembers.CS
{
/// <summary>
/// This class is used as PropertyGrid.SelectedObject.
/// </summary>
public class Properties
{
private int m_ID;
private string m_Name;
private string m_Family;
private string m_Type;
private string m_StructuralType;
private string m_StructuralUsage;
private string m_Material;
/// <summary>
/// the value of the element id as an integer
/// </summary>
[CategoryAttribute("Identity")]
public int ID
{
get
{
return m_ID;
}
}
/// <summary>
/// a human readable name for the Element.
/// </summary>
[CategoryAttribute("Identity")]
public string Name
{
get
{
return m_Name;
}
}
/// <summary>
/// a human readable name for the family name.
/// </summary>
[CategoryAttribute("Category")]
public string Family
{
get
{
return m_Family;
}
}
/// <summary>
/// a human readable name for the family type name.
/// </summary>
[CategoryAttribute("Category")]
public string Type
{
get
{
return m_Type;
}
}
/// <summary>
/// the primary structural type of the instance, such as beam or column etc.
/// </summary>
[CategoryAttribute("Structural")]
public string StructuralType
{
get
{
return m_StructuralType;
}
}
/// <summary>
/// the primary structural usage of the instance, such as brace, girder etc.
/// </summary>
[CategoryAttribute("Structural")]
public string StructuralUsage
{
get
{
return m_StructuralUsage;
}
}
/// <summary>
/// the physical material from which the instance is made.
/// </summary>
[CategoryAttribute("Structural")]
public string Material
{
get
{
return m_Material;
}
}
/// <summary>
/// get this family instance's properties to display.
/// </summary>
/// <param name="f">a In-Place family instance</param>
public Properties(FamilyInstance f)
{
m_ID = f.Id.IntegerValue;
m_Name = f.Name;
m_Family = f.Symbol.Family.Name;
m_Type = f.Symbol.Name;
m_StructuralType = f.StructuralType.ToString();
try
{
m_StructuralUsage = f.StructuralUsage.ToString();
}
catch(Exception)
{
m_StructuralUsage = null;
}
m_Material = f.StructuralMaterialType.ToString();
}
}
}
InPlaceMembersForm.cs
//
// (C) Copyright 2003-2019 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
namespace Revit.SDK.Samples.InPlaceMembers.CS
{
partial class InPlaceMembersForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed;
/// otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.instancePropertyGrid = new System.Windows.Forms.PropertyGrid();
this.OKbutton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.modelPictureBox = new Revit.SDK.Samples.InPlaceMembers.CS.PictureBox3D();
this.SuspendLayout();
//
// instancePropertyGrid
//
this.instancePropertyGrid.Location = new System.Drawing.Point(12, 12);
this.instancePropertyGrid.Name = "instancePropertyGrid";
this.instancePropertyGrid.Size = new System.Drawing.Size(547, 238);
this.instancePropertyGrid.TabIndex = 2;
//
// OKbutton
//
this.OKbutton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.OKbutton.Location = new System.Drawing.Point(346, 573);
this.OKbutton.Name = "OKbutton";
this.OKbutton.Size = new System.Drawing.Size(88, 23);
this.OKbutton.TabIndex = 0;
this.OKbutton.Text = "&OK";
this.OKbutton.UseVisualStyleBackColor = true;
this.OKbutton.Click += new System.EventHandler(this.OKbutton_Click);
//
// cancelButton
//
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(471, 573);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(88, 23);
this.cancelButton.TabIndex = 3;
this.cancelButton.Text = "&Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
//
// modelPictureBox
//
this.modelPictureBox.Cursor = System.Windows.Forms.Cursors.SizeAll;
this.modelPictureBox.DataSource = null;
this.modelPictureBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.modelPictureBox.Location = new System.Drawing.Point(12, 256);
this.modelPictureBox.Name = "modelPictureBox";
this.modelPictureBox.Size = new System.Drawing.Size(547, 311);
this.modelPictureBox.TabIndex = 1;
this.modelPictureBox.UseVisualStyleBackColor = true;
//
// InPlaceMembersForm
//
this.AcceptButton = this.OKbutton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(571, 606);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.OKbutton);
this.Controls.Add(this.modelPictureBox);
this.Controls.Add(this.instancePropertyGrid);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "InPlaceMembersForm";
this.ShowInTaskbar = false;
this.Text = "In-Place Members";
this.Load += new System.EventHandler(this.InPlaceMembersForm_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PropertyGrid instancePropertyGrid;
private PictureBox3D modelPictureBox;
private System.Windows.Forms.Button OKbutton;
private System.Windows.Forms.Button cancelButton;
}
}
版权所有 :无锡模信建筑科技有限公司 苏ICP备2021028830号-1 BIM建模|BIM技术应用|BIM软件开发
联系地址:江苏省无锡市新吴区龙山路4号B座705 手机:18761516598