吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 95|回复: 2
收起左侧

[经验求助] 关于tekla二次开发,图纸零件标记创建。

[复制链接]
Wy62Wy62 发表于 2026-3-13 11:24
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);
        }
    }
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

任逍遥 发表于 2026-3-14 10:54
这是干嘛?问的啥?tekla开发都发表到这了
 楼主| Wy62Wy62 发表于 2026-3-14 10:57
任逍遥 发表于 2026-3-14 10:54
这是干嘛?问的啥?tekla开发都发表到这了

看另外一个帖子,这个是重复创建了问题没问。用ai创建的代码,但是在tekla2020里面只能生成注释标记,我想要的是零件标记,一直不能创建零件标记,所以想问问大佬们这个应该怎么修改才能正确创建零件标记。不会编程,这个是ai写的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-3-17 13:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表