明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: tender138

[界面] 请问Autolisp如何获取C#做的非模态界面文本框值?

[复制链接]
发表于 2024-10-31 16:06:45 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-10-31 21:01 编辑
tender138 发表于 2024-10-31 10:49
谢谢!修改以下红色代码可以返回值,但是窗口设计值,非修改后的值

Form是异步的,Lisp是同步的,
只能LispFunc上面Get其中一个字段,来包装返回

public class Class1 {
Form _form = null;

[CommandMethod(nameof(RunForm))]
static public void RunForm() {
    _form = new();
    _form.Show();
    new Thread(()=>{
        int a = 0;
        while(true)
           _form.TextBox1.Text = a++;
    }).Start();
}

[LispFunction(nameof(GetFormValue))]
public static ResultBuffer GetFormValue(ResultBuffer resBufIn) {
    return new ResultBuffer(new TypedValue((int)LispDataType.Int32, _form.TextBox1.Text));
}

[LispFunction(nameof(PutFormValue))]
public static ResultBuffer PutFormValue(ResultBuffer resBufIn) {
    _form.Invoke(()=>{
        TextBox1.Text = resBufIn.ToString();
    });
    return true;
}
}
 楼主| 发表于 2024-10-31 20:48:10 | 显示全部楼层
yshf 发表于 2024-10-31 15:34
不贴出窗体代码,不好判断

非常感谢兄弟一再指导,麻烦帮我修改一下,谢谢!


using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.Runtime;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using Autodesk.AutoCAD.DatabaseServices;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;


namespace ModelessDlg
{
    public class Class1
    {
    [CommandMethod("LoadWin")]
        static public void LoadWin()
        {
            FormMain MyForm = new FormMain();
            MyForm.Show();
            MyForm.TextBox1.Text = "001";
            MyForm.TextBox2.Text = "002";

        }

        [LispFunction("GetVal")]
        public static ResultBuffer GetVal(ResultBuffer resBufIn)
        {
            FormMain MyForm = new FormMain();
            return new ResultBuffer(new TypedValue((int)LispDataType.Int32, MyForm.TextBox1.Text));
        }
    }
}




namespace ModelessDlg
{
    partial class FormMain
    {
        /// <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.TextBox1 = new System.Windows.Forms.TextBox();
            this.TextBox2 = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // TextBox1
            //
            this.TextBox1.Location = new System.Drawing.Point(99, 12);
            this.TextBox1.Name = "TextBox1";
            this.TextBox1.Size = new System.Drawing.Size(100, 21);
            this.TextBox1.TabIndex = 0;
            this.TextBox1.Text = "123";
            //
            // TextBox2
            //
            this.TextBox2.Location = new System.Drawing.Point(99, 60);
            this.TextBox2.Name = "TextBox2";
            this.TextBox2.Size = new System.Drawing.Size(100, 21);
            this.TextBox2.TabIndex = 1;
            this.TextBox2.Text = "456";
            //
            // label1
            //
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(37, 15);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(29, 12);
            this.label1.TabIndex = 2;
            this.label1.Text = "长度";
            //
            // label2
            //
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(37, 60);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(29, 12);
            this.label2.TabIndex = 3;
            this.label2.Text = "宽度";
            //
            // FormMain
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(230, 93);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.TextBox2);
            this.Controls.Add(this.TextBox1);
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "FormMain";
            this.Text = "参数";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        public System.Windows.Forms.TextBox TextBox1;
        public System.Windows.Forms.TextBox TextBox2;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
    }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2024-10-31 20:50:56 | 显示全部楼层
你有种再说一遍 发表于 2024-10-31 16:06
Form是异步的,Lisp是同步的,
只能LispFunc上面Get其中一个字段,来包装返回

非常感谢!具体怎么修改呢
发表于 2024-10-31 21:01:10 | 显示全部楼层
tender138 发表于 2024-10-31 20:50
非常感谢!具体怎么修改呢

加一个invoke而已,修改原帖了.
发表于 2024-10-31 22:15:06 | 显示全部楼层
LispFunction改为如下一试:
        [LispFunction("GetVal")]
        public static ResultBuffer GetVal(ResultBuffer resBufIn)
        {
            FormMain MyForm = new FormMain();
            MyForm.TextBox1.Text = "001";
            MyForm.TextBox2.Text = "002";
            Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(MyForm);
            return new ResultBuffer(new TypedValue((int)LispDataType.Text, MyForm.TextBox1.Text),
                                    new TypedValue((int)LispDataType.Text, MyForm.TextBox2.Text)
                                   );
        }
 楼主| 发表于 2024-11-2 16:38:40 | 显示全部楼层
本帖最后由 tender138 于 2024-11-2 16:40 编辑
yshf 发表于 2024-10-31 22:15
LispFunction改为如下一试:
        [LispFunction("GetVal")]
        public static ResultBuffer Get ...

谢谢!我是想在非模态窗口中修改参数(不关闭窗口),然后用lisp提取窗口实时参数作图
 楼主| 发表于 2024-11-2 16:40:12 | 显示全部楼层
你有种再说一遍 发表于 2024-10-31 16:06
Form是异步的,Lisp是同步的,
只能LispFunc上面Get其中一个字段,来包装返回

多谢你的热心!因水平有限,我怎么也实现不了。
我是想在非模态窗口中修改参数(不关闭窗口),然后用lisp提取窗口实时参数作图
发表于 2024-11-2 16:44:06 | 显示全部楼层
tender138 发表于 2024-11-2 16:40
多谢你的热心!因水平有限,我怎么也实现不了。
我是想在非模态窗口中修改参数(不关闭窗口),然后用li ...

先沉淀,沉淀先,总有一天你会知道的,代码就是那么普通
 楼主| 发表于 2024-11-2 16:56:23 | 显示全部楼层
你有种再说一遍 发表于 2024-11-2 16:44
先沉淀,沉淀先,总有一天你会知道的,代码就是那么普通

非常感谢!能否麻烦你在我这个基础帮忙修改?所有搜索都找遍了,还是不得要领

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-11-4 13:54:37 来自手机 | 显示全部楼层
本帖最后由 pxt2001 于 2024-11-5 08:32 编辑

楼主这个问题完全可以用Lisp+openDCl解决。
曾经我和你一样,初步接触了C#,发现轮子少,资料少,学习起来很费劲。然后lisp里面很简单的事情,在这里实现很复杂。想抄东西都没得抄。
自己在lisp需解决的问题是动态效果,是Lisp的上限在哪里。在C#解决的问题是画一条直线,C#的下限在哪里。
后面还是回到熟悉的,得心应手的lisp。捣鼓这个一般都是工程师不是程序员,只要能够解决问题就行,管他是黑猫还是白猫。
很多C#高手的确做出输入法自动切换,贴边式屏幕菜单。但极少公布源码,很可能都是一些商业秘密,也可能是程序员。
论坛C#大神,如果发布一些Lisp实现不了的程序,补充lisp的缺陷。影响会很巨大。我都嫌自己陷入Lisp是否值得,但在C#陷入更深(花费更多精力但收获不大,轮子少),工程师90%的CAD问题在Lisp能够解决。
如果你是开发天正,探索者,或者是程序员,另当别论了。欢迎大神来批判。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-1-3 15:20 , Processed in 0.270584 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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