CISDI郑贵元 2025-11-23 00:10 采纳率: 0%
浏览 7
已结题

Grasshopper二次开发Attribute疑惑

#Grasshopper二次开发,调整了输入参数的Pivot和Bounds属性。但是右击参数的Flatten等命令,绘制的图标位置还是初始的Pivot的位置绘制。图片如下。能提示一下如何处理这种情况吗?

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-11-23 09:10
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    在Grasshopper二次开发中,如果你调整了输入参数的 PivotBounds 属性,但发现右击参数时使用 Flatten、Graft 等命令 时,图标仍然按照初始的 Pivot 位置绘制,这通常是因为 Grasshopper 并不自动更新这些视觉属性,尤其是在某些操作(如 Flatten)后。


    ✅ 问题分析

    Grasshopper 的参数对象(GH_Param<T>)中的 PivotBounds 是用于控制显示位置和大小的。然而:

    • Pivot 只影响参数的“中心点”位置,并不是所有命令都尊重这个设置。
    • Flatten、Graft 等操作会创建新的参数对象,它们可能继承原始参数的默认 Pivot 设置,而不是你手动修改后的值。
    • Grasshopper 在某些情况下(例如重新生成图形界面)会重置这些属性。

    🔧 解决方案

    为了解决这个问题,你需要在每次创建新参数(如 Flatten 操作后)时,显式地设置其 PivotBounds 属性

    1. 确保在自定义参数类中重写 Draw 方法

    你可以通过自定义参数类来控制其绘制行为。比如:

    public class CustomParam : GH_Param<GH_Number>
    {
        public CustomParam() : base("Custom Param", "CP", "A custom parameter with custom pivot", "Params", "Custom")
        {
            // 设置初始 Pivot 和 Bounds
            this.Pivot = new Point2d(0, 0);
            this.Bounds = new RectangleF(-10, -10, 20, 20);
        }
    
        protected override void Draw(GH_PreviewArgs args)
        {
            // 自定义绘制逻辑(可选)
            base.Draw(args);
        }
    }
    

    2. OnComponentChangedOnNewData 中更新参数属性

    当参数数据变化或组件被重新加载时,可以触发对 PivotBounds 的更新:

    protected override void OnComponentChanged()
    {
        base.OnComponentChanged();
        this.Pivot = new Point2d(0, 0); // 强制设置新的 Pivot
        this.Bounds = new RectangleF(-10, -10, 20, 20);
    }
    

    3. 在 Flatten/Graft 操作后重新设置 Pivot

    如果 Flatten 或 Graft 创建了新参数,你可以在该操作后手动设置新参数的 PivotBounds。例如,在 AddParameter 方法中:

    private void AddCustomParam()
    {
        var param = new CustomParam();
        param.Pivot = new Point2d(5, 5); // 设置新参数的 Pivot
        param.Bounds = new RectangleF(0, 0, 20, 20);
        this.Params.Add(param);
    }
    

    4. 使用 GH_Component.RegisterInputParams 控制输入参数的布局

    如果你是通过 RegisterInputParams 注册参数,也可以在此处设置 PivotBounds

    protected override void RegisterInputParams(GH_InputParamManager pManager)
    {
        var param = new GH_Param<GH_Number>(new GH_Number());
        param.Name = "Input";
        param.NickName = "In";
        param.Description = "Input value";
        param.Pivot = new Point2d(0, 0); // 设置输入参数的 Pivot
        param.Bounds = new RectangleF(-10, -10, 20, 20);
    
        pManager.AddParam(param);
    }
    

    📌 总结

    | 步骤 | 内容 | |------|------| | 1 | 重写 Draw 方法,确保自定义参数正确绘制 | | 2 | 在 OnComponentChangedOnNewData强制更新 PivotBounds | | 3 | 在 Flatten/Graft 操作后手动设置新参数的 Pivot 和 Bounds | | 4 | 在 RegisterInputParams初始化输入参数的 Pivot 和 Bounds |


    💡 建议

    • 如果你经常需要动态调整参数位置,建议使用 GH_Param<T>.PivotGH_Param<T>.Bounds 的绑定机制,避免硬编码。
    • 使用 Grasshopper 的 GH_Document 事件监听(如 DocumentChanged)来统一管理参数布局。

    如果你能提供具体的代码片段或截图,我可以进一步帮助你定位问题并给出更精确的修复方案。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月28日
  • 创建了问题 11月23日