好友
阅读权限 10
听众
最后登录 1970-1-1
100 吾爱币
using System ;
using System . Windows . Forms ;
using Tekla . Structures . Drawing ;
using Tekla . Structures . Geometry3d ;
namespace 杂七杂八
{
public class _6_1_5_创建零件标记
{
public static void ExecuteAnnotation ()
{
try
{
// 初始化 DrawingHandler
var drawingHandler = new DrawingHandler ();
if (! drawingHandler . GetConnectionStatus ())
{
ShowMessage ("错误" , "无法连接到 Tekla Structures" );
return ;
}
// 获取当前打开的图纸
var activeDrawing = drawingHandler . GetActiveDrawing ();
if (activeDrawing == null )
{
ShowMessage ("错误" , "没有打开的图纸" );
return ;
}
// 选择零件
var picker = drawingHandler . GetPicker ();
DrawingObject pickedObject ;
ViewBase view ;
try
{
picker . PickObject ("请选择要标记的零件" , out pickedObject , out view );
}
catch
{
ShowMessage ("提示" , "操作已取消" );
return ;
}
if (pickedObject == null )
{
ShowMessage ("提示" , "操作已取消" );
return ;
}
// 验证是否为零件对象
var part = pickedObject as Part ;
if (part == null )
{
ShowMessage ("错误" , "请选择零件对象" );
return ;
}
// 创建零件标记
string errorMessage ;
bool success = CreatePartMark (part , view , out errorMessage );
if (success )
{
// 提交更改
activeDrawing . CommitChanges ();
ShowMessage ("成功" , "零件标记创建成功" );
}
else
{
ShowMessage ("错误" , $" 无法创建零件标记: \n { errorMessage } " );
}
}
catch (Exception ex )
{
ShowMessage ("错误" , $" 操作失败: { ex . Message } " );
}
}
private static bool CreatePartMark (Part part , ViewBase view , out string errorMessage )
{
errorMessage = string . Empty ;
try
{
// 创建标记
Mark mark = null ;
try
{
// 尝试获取零件的 ModelIdentifier 属性
Tekla . Structures . Identifier modelId = null ;
try
{
var partType = part . GetType ();
var modelIdProperty = partType . GetProperty ("ModelIdentifier" , System . Reflection . BindingFlags . Instance | System . Reflection . BindingFlags . Public | System . Reflection . BindingFlags . NonPublic );
if (modelIdProperty != null )
{
modelId = modelIdProperty . GetValue (part ) as Tekla . Structures . Identifier ;
if (modelId != null && modelId . IsValid ())
{
errorMessage += $" 成功获取 ModelIdentifier: { modelId . ID } \n " ;
}
}
}
catch (Exception ex )
{
errorMessage += $" 获取 ModelIdentifier 失败: { ex . Message } \n " ;
}
// 尝试使用模型对象创建标记
if (modelId != null && modelId . IsValid ())
{
try
{
// 初始化模型
var model = new Tekla . Structures . Model . Model ();
if (model . GetConnectionStatus ())
{
// 尝试获取模型对象
var modelObject = model . SelectModelObject (modelId );
if (modelObject != null )
{
errorMessage += $" 成功获取模型对象: { modelObject . GetType () . FullName } \n " ;
// 尝试使用模型对象创建标记
try
{
// 尝试使用模型对象创建标记
errorMessage += "尝试使用模型对象创建标记... \n " ;
// 注意:这里可能需要类型转换
mark = new Mark (part );
errorMessage += "使用零件对象创建标记 \n " ;
}
catch (Exception ex )
{
errorMessage += $" 使用模型对象创建标记失败: { ex . Message } \n " ;
// 回退到使用零件对象
mark = new Mark (part );
errorMessage += "回退到使用零件对象创建标记 \n " ;
}
}
else
{
errorMessage += "无法获取模型对象 \n " ;
mark = new Mark (part );
errorMessage += "使用零件对象创建标记 \n " ;
}
}
else
{
errorMessage += "无法连接到模型 \n " ;
mark = new Mark (part );
errorMessage += "使用零件对象创建标记 \n " ;
}
}
catch (Exception ex )
{
errorMessage += $" 使用模型对象创建标记失败: { ex . Message } \n " ;
mark = new Mark (part );
errorMessage += "使用零件对象创建标记 \n " ;
}
}
else
{
mark = new Mark (part );
errorMessage += "使用零件对象创建标记 \n " ;
}
errorMessage += $" IsAssociativeNote: { mark . IsAssociativeNote } \n " ;
errorMessage += $" 标记类型: { mark . GetType () . FullName } \n " ;
errorMessage += $" 零件类型: { part . GetType () . FullName } \n " ;
}
catch (Exception ex )
{
errorMessage += $" 创建 Mark 对象失败: { ex . Message } \n " ;
return false ;
}
// 暂时不加载属性文件,看看是否会影响 IsAssociativeNote 的值
errorMessage += "暂时不加载属性文件,使用默认属性 \n " ;
errorMessage += $" 加载属性文件前 IsAssociativeNote: { mark . IsAssociativeNote } \n " ;
// 设置标记属性
try
{
// 设置基本属性
mark . Attributes . TransparentBackground = true ;
mark . Attributes . RotationAngle = 0 ;
// 设置框架属性
if (mark . Attributes . Frame != null )
{
mark . Attributes . Frame . Color = Tekla . Structures . Drawing . DrawingColors . Green ;
}
// 设置箭头属性
if (mark . Attributes . ArrowHead != null )
{
mark . Attributes . ArrowHead . Height = 1 ;
mark . Attributes . ArrowHead . Width = 2.5 ;
}
// 设置放置属性
if (mark . Attributes . PlacingAttributes != null )
{
mark . Attributes . PlacingAttributes . IsFixed = false ;
// 设置放置距离
if (mark . Attributes . PlacingAttributes . PlacingDistance != null )
{
mark . Attributes . PlacingAttributes . PlacingDistance . SearchMargin = 3 ;
mark . Attributes . PlacingAttributes . PlacingDistance . MinimalDistance = 5 ;
mark . Attributes . PlacingAttributes . PlacingDistance . MaximalDistance = 0 ;
}
// 设置放置象限
if (mark . Attributes . PlacingAttributes . PlacingQuarter != null )
{
mark . Attributes . PlacingAttributes . PlacingQuarter . TopLeft = true ;
mark . Attributes . PlacingAttributes . PlacingQuarter . TopRight = true ;
mark . Attributes . PlacingAttributes . PlacingQuarter . BottomLeft = true ;
mark . Attributes . PlacingAttributes . PlacingQuarter . BottomRight = true ;
}
}
errorMessage += "成功设置标记属性 \n " ;
}
catch (Exception ex )
{
errorMessage += $" 设置标记属性失败: { ex . Message } \n " ;
}
// 设置标记位置
SetMarkPosition (mark , view , ref errorMessage );
// 插入标记到图纸
errorMessage += " \n 尝试插入标记... \n " ;
if (! mark . Insert ())
{
errorMessage = "标记插入失败" ;
return false ;
}
errorMessage += "标记插入成功 \n " ;
// 引导线创建暂时移除,需要根据正确的构造函数参数调整
errorMessage += "引导线创建暂时跳过 \n " ;
// 提交修改
mark . Modify ();
errorMessage += "标记修改完成 \n " ;
// 验证标记是否成功创建
errorMessage += " \n === 验证标记创建结果 === \n " ;
try
{
// 检查标记是否关联到视图
var markView = mark . GetView ();
if (markView != null )
{
errorMessage += "✓ 标记已成功关联到视图 \n " ;
}
else
{
errorMessage += "✗ 标记未关联到视图 \n " ;
}
// 检查标记内容
if (mark . Attributes . Content != null )
{
errorMessage += "✓ 标记内容已设置 \n " ;
}
else
{
errorMessage += "✗ 标记内容未设置 \n " ;
}
}
catch (Exception ex )
{
errorMessage += $" 验证失败: { ex . Message } \n " ;
}
return true ;
}
catch (Exception ex )
{
errorMessage = $" 创建零件标记时发生错误: { ex . Message } " ;
return false ;
}
}
private static void SetMarkPosition (Mark mark , ViewBase view , ref string errorMessage )
{
try
{
// 获取视图的边界信息来计算中心位置
double viewWidth = 0 ;
double viewHeight = 0 ;
Point viewOrigin = new Point (0 , 0 , 0 );
// 使用反射获取视图属性(如果可用)
var widthProperty = view . GetType (). GetProperty ("Width" , System . Reflection . BindingFlags . Instance | System . Reflection . BindingFlags . Public | System . Reflection . BindingFlags . NonPublic );
var heightProperty = view . GetType (). GetProperty ("Height" , System . Reflection . BindingFlags . Instance | System . Reflection . BindingFlags . Public | System . Reflection . BindingFlags . NonPublic );
var originProperty = view . GetType (). GetProperty ("Origin" , System . Reflection . BindingFlags . Instance | System . Reflection . BindingFlags . Public | System . Reflection . BindingFlags . NonPublic );
if (widthProperty != null ) viewWidth = (double )widthProperty . GetValue (view );
if (heightProperty != null ) viewHeight = (double )heightProperty . GetValue (view );
if (originProperty != null ) viewOrigin = (Point )originProperty . GetValue (view );
errorMessage += $" 视图原点:( { viewOrigin . X } , { viewOrigin . Y } ) \n " ;
errorMessage += $" 视图尺寸:宽= { viewWidth } , 高= { viewHeight } \n " ;
// 计算视图中心位置
double centerX = viewOrigin . X + (viewWidth > 0 ? viewWidth / 2 : 100 );
double centerY = viewOrigin . Y + (viewHeight > 0 ? viewHeight / 2 : 100 );
// 设置标记位置为视图中心
mark . InsertionPoint = new Point (centerX , centerY , 0 );
errorMessage += $" 设置标记位置为视图中心:( { centerX } , { centerY } ) \n " ;
}
catch (Exception ex )
{
errorMessage += $" 设置标记位置失败: { ex . Message } \n " ;
// 回退到默认位置
mark . InsertionPoint = new Point (100 , 100 , 0 );
errorMessage += "回退到默认位置:(100, 100) \n " ;
}
}
private static void ShowMessage (string title , string message )
{
MessageBox . Show (message , title , MessageBoxButtons . OK , MessageBoxIcon . Information );
}
}
}
我来回答
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。