设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 725|回复: 5

[每日一码] .net 定义lisp 字符串函数

[复制链接]

已领礼包: 57个

财富等级: 招财进宝

发表于 2019-10-27 21:05:24 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 brainstorm 于 2019-10-28 10:17 编辑

初学.net,写了几个lisp字符串函数,解决lisp字符串处理功能较弱,请指点
using System;
using System.Text.RegularExpressions;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace commom_lib
{
     /// <summary>
     /// 辅助操作类
    /// </summary>
     public static partial class Tools
     {
         private static object results;
         /// <summary>
         /// 字符串替换,参数:被替换字符 旧字符 新字符
        /// </summary>
         /// <param name="rb"></param>
         /// <returns></returns>
         [LispFunction("zgx:str:replace")]
         public static string Lsp_stringreplace(ResultBuffer rb)
         {
             string iRtn = null;
             if (rb != null)
             {
                 TypedValue[] tb = rb.AsArray();
                 if (tb.Length == 3 && tb[0].TypeCode == (int)LispDataType.Text && tb[1].TypeCode == (int)LispDataType.Text && tb[2].TypeCode == (int)LispDataType.Text)
                 {
                     string toreplace = tb[0].Value as string;
                     string oldstr = tb[1].Value as string;
                     string newstr = tb[2].Value as string;
                     iRtn = toreplace.Replace(oldstr, newstr);
                 }
             }
             return iRtn;
         }
         /// <summary>
         /// 字符分割,同split,参数string seperator;
         /// (zgx:str:Split input seperator)
         /// </summary>
         /// <param name="rb"></param>
         /// <returns></returns>
         [LispFunction("zgx:str:Split")]
         public static ResultBuffer Lsp_stringSplit(ResultBuffer rb)
         {
             ResultBuffer reb = new ResultBuffer();
             try
             {
                 if (rb != null)
                 {
                     TypedValue[] tb = rb.AsArray();
                     //ResultBuffer reb = new ResultBuffer();
                     if (tb.Length == 2 && tb[0].TypeCode == (int)LispDataType.Text && tb[1].TypeCode == (int)LispDataType.Text)
                     {
                         string toReplace = tb[0].Value as string;
                         string sep = tb[1].Value as string;
                         string[] strArr = Regex.Split(toReplace, sep);
                         for (int i = 0; i < strArr.Length; i++)
                         {
                             if (strArr != "")
                                 reb.Add(new TypedValue((int)LispDataType.Text, strArr));
                         }
                     }
                     else
                         reb = null;
                 }
                 else
                     reb = null;
             }
             catch (Autodesk.AutoCAD.Runtime.Exception ex)
             {
             }
             //如何判断reb为空?
             return reb;
         }
         /// <summary>
         /// 正则表达式,与晓东函数顺序一致;
        /// (zgx:regExps patten input [regoptions默认 1+2])
         /// </summary>
         /// <param name="rb"></param>
         /// <returns></returns>
         [LispFunction("zgx:regExps")]
         public static ResultBuffer Lsp_regexps(ResultBuffer rb)
         {
             ResultBuffer Rsb = new ResultBuffer();
             int RegOpts = 3;
             try
             {
                 if (rb != null)
                 {
                     TypedValue[] tb = rb.AsArray();
                     //ResultBuffer reb = new ResultBuffer();
                     if (tb.Length >= 2 & tb.Length <= 3 && tb[0].TypeCode == (int)LispDataType.Text && tb[1].TypeCode == (int)LispDataType.Text)
                     {
                         string pattern = tb[0].Value as string;
                         string s = tb[1].Value as string;
                         if (tb.Length == 3
                             && tb[2].TypeCode == (int)LispDataType.Int32
                             | tb[2].TypeCode == (int)LispDataType.Int16
                             )
                             RegOpts = Convert.ToInt32(tb[2].Value);
                         MatchCollection results = Regex.Matches(s, pattern, (RegexOptions)RegOpts);
                         if (results.Count > 0)
                             for (int i = 0; i < results.Count; i++)
                             {
                                 if (results.Value != "")
                                     Rsb.Add(new TypedValue((int)LispDataType.Text, results.Value));
                             }
                         else
                             Rsb = null;
                     }
                     else
                         Rsb = null;
                 }
                 else
                     Rsb = null;
             }
             catch (Autodesk.AutoCAD.Runtime.Exception ex)
             {
             }
             //如何判断reb为空?
             return Rsb;
         }
         /// <summary>
         /// (zgx:regExpr pat input new [替换选项 替换次数T,仅替换一次])
         /// 0       None
         ///1       IgnoreCase
         ///2       Multiline
         ///4       ExplicitCapture
         ///8       Compiled
         ///16      Singleline
         ///32      IgnorePatternWhitespace
         ///64      RightToLeft
         ///256     ECMAScript
         ///512     CultureInvariant
         /// </summary>
         /// <param name="rb"></param>
         /// <returns></returns>
         [LispFunction("zgx:regExpr")]
         public static string Lsp_regexpr(ResultBuffer rb)
         {
             string Rtnstr = null;
             int RegOpts = 3;
             try
             {
                 if (rb != null)
                 {
                     TypedValue[] tb = rb.AsArray();
                     if (tb.Length >= 3 & tb.Length <= 5
                         && tb[0].TypeCode == (int)LispDataType.Text
                         && tb[1].TypeCode == (int)LispDataType.Text
                         && tb[2].TypeCode == (int)LispDataType.Text
                         )
                     {
                         string pattern = tb[0].Value as string;
                         string sInput = tb[1].Value as string;
                         string sNew = tb[2].Value as string;
                         int iCount = sInput.Length;
                         if (tb.Length >= 4 & tb.Length <= 5
                             && tb[3].TypeCode == (int)LispDataType.Int32
                             | tb[3].TypeCode == (int)LispDataType.Int16
                             )
                             RegOpts = Convert.ToInt32(tb[3].Value);
                         if (tb.Length == 5
                             && tb[4].Value != null
                             )
                             iCount = 1;
                         Regex reg = new Regex(pattern, (RegexOptions)RegOpts);
                         Rtnstr = reg.Replace(sInput, sNew, iCount);
                     }
                 }
             }
             catch (Autodesk.AutoCAD.Runtime.Exception ex)
             {
             }
             return Rtnstr;
         }
         //string input = "aaaaaaaaaaa";
         //string pat = "a";
         //string newstring = "v";
         //Regex re = new Regex(pat);
         //string rtn = re.Replace(input, newstring, input.Length, 1);
         /// <summary>
         /// substr同lispsubstr,参数:字符串 起始位置(从1开始) 截取长度
        /// </summary>
         /// <param name="rb"></param>
         /// <returns></returns>
         [LispFunction("zgx:str:Substring")]
         public static string Lsp_stringSubstring(ResultBuffer rb)
         {
             string iRtn = null;
             if (rb == null) return null;
             try
             {
                 TypedValue[] tb = rb.AsArray();
                 if (tb.Length == 3 &&
                     tb[0].TypeCode == (int)LispDataType.Text &&
                     tb[1].TypeCode == (int)LispDataType.Int32 |
                     tb[1].TypeCode == (int)LispDataType.Int16 |
                     tb[1].TypeCode == (int)LispDataType.Double &&
                     tb[2].TypeCode == (int)LispDataType.Double |
                     tb[2].TypeCode == (int)LispDataType.Int32 |
                     tb[2].TypeCode == (int)LispDataType.Int16)
                 {
                     string toReplace = tb[0].Value as string;
                     int strLen = toReplace.Length;
                     int start = Convert.ToInt32(tb[1].Value) - 1;
                     int Length = Convert.ToInt32(tb[2].Value);
                     if (start < 1)
                         start = 1;
                     if (start + Length > strLen)
                         Length = strLen - start;
                     iRtn = toReplace.Substring(start, Length);
                 }
             }
             catch (Autodesk.AutoCAD.Runtime.Exception ex)
             {
             }
             return iRtn;
         }
         /// <summary>
         /// 返回字符串长度,汉字按一个字符计算;
        /// 输入:字符串
        /// </summary>
         /// <param name="rb"></param>
         /// <returns></returns>
         [LispFunction("zgx:str:length")]
         public static object Lsp_strlength(ResultBuffer rb)
         {
             object iRtn = null;
             if (rb == null) return null;
             TypedValue[] tb = rb.AsArray();
             try
             {
                 if (tb.Length == 1 && tb[0].TypeCode == (int)LispDataType.Text)
                 {
                     string toreplace = tb[0].Value as string;
                     iRtn = toreplace.Length;
                 }
             }
             catch (Autodesk.AutoCAD.Runtime.Exception ex)
             {
             }
             return iRtn;
         }
     }
}


来自: 微社区

评分

参与人数 1D豆 +2 收起 理由
gdfyhao + 2 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 293个

财富等级: 日进斗金

发表于 2019-10-28 08:36:40 | 显示全部楼层
背景颜色太深,看不到字
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

发表于 2019-10-28 09:32:22 | 显示全部楼层
按 Ctrl+a,选中状态可以看清
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2019-11-17 18:32:25 | 显示全部楼层
很实用的工具函数,谢谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-11-29 02:59:55 | 显示全部楼层
29526783_201911162144130456972822.png

29526783_201911231434160378324104.png

29526783_201911240313580202788829.jpg

172352ur6fbzzy1ytg1txy.jpg


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-11-3 09:23:12 | 显示全部楼层
我都快要调lisp
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )  

GMT+8, 2022-8-18 14:51 , Processed in 0.152046 second(s), 27 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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