首页 > 其他分享 >分享一个基于ChatGPT实现基于Convars布局思路的实现过程

分享一个基于ChatGPT实现基于Convars布局思路的实现过程

时间:2024-08-23 13:03:51浏览次数:3  
标签:Convars 基于 set get 单元格 cell new ChatGPT public

一、思路

在AI的大背景,应用层算法已经不是问题,那么程序员的差距主要在认知思维模式和创新上面。目前AI的局限主要却决于沟通的效率,这是双方的问题,AI可能理解能力不足,或者提问者表达能力不足。
这里我以PDFsharp实现Grid布局模式分享一下基于GPT实现的过程。因为PDFsharp只提供了XGraphics。类似.NET自带的Drawing图像库。
即这个思路通用适用于支持Drawing操作相关的库。
开源地址:https://github.com/soul-soft/Soul.PDFsharp.Extensions

  1. Grid布局:基于行列进行布局。
  2. 内外边距:行和单元格存在内外边距,这里的内外边距控制当前元素绘制的起点实现。
  3. 行宽:优先扣除掉行左右外边距,如果宽度不够那么压缩最后一个单元格。这样实现了行居中的效果,通过控制内外边距Margin。
  4. 单元格的宽度:如果是一个文本单元格,用户未指定宽度,那么使用XGraphics计算出来文本的宽度,作为单元格的宽度。如果行内只有一个单元格并且没有指定宽度,那么等于行宽。
  5. 单元格的高度:如果当前是单行文本,那么使用XGraphics计算出来文本的高度,如果单元格支持换行。我们这时候需要先计算完所有单元格的宽度,然后基于单元格的宽度(扣除掉内边距,因为宽度计算方式由思路4决定),就可以计算出来行数了,显然内边距会影响行数。
  6. 单元格的高度:行数 * 字体高度 +(行数-1)* 行间距 + 上下内边距。(高度自适应)
  7. 行高:等于行内单元格最高的高度,实现高度自适应。如果用户指定了行高,并且大于行内单元格最高的高度,那么行高使用用户指定的行高

二、抽象数据结构

//网格
public class XGrid
{
    private readonly List<XGridRow> _rows = new List<XGridRow>();

    public void DrawRow(Action<XGridRow> configure)
    {
        var row = new XGridRow();
        configure(row);
        _rows.Add(row);
    }

    internal IReadOnlyList<XGridRow> Rows => _rows;
}
//行
public class XGridRow
{
    private readonly List<XGridCell> _cells = new List<XGridCell>();

    public XGridBox Margin { get; set; } = new XGridBox(0);

    public double Height { get; set; }
    public double Width { get; set; }

    public XGridBorder Border { get; } = new XGridBorder();

    public void DrawTextCell(Action<XGridTextCell> configure)
    {
        var cell = new XGridTextCell();
        configure(cell);
        _cells.Add(cell);
    }

    public void DrawImageCell(Action<XGridImageCell> configure)
    {
        var cell = new XGridImageCell();
        configure(cell);
        _cells.Add(cell);
    }

    internal IReadOnlyList<XGridCell> Cells => _cells;
}
//单元格
public abstract class XGridCell
{
    /// <summary>
    /// 高度
    /// </summary>
    public double Height { get; set; }
    /// <summary>
    /// 宽度
    /// </summary>
    public double Width { get; set; }
    /// <summary>
    /// 控制内边距
    /// </summary>
    public XGridBox Margin { get; set; } = new XGridBox(0);
    /// <summary>
    /// 控制外边距
    /// </summary>
    public XGridBox Padding { get; set; } = new XGridBox(0);
    /// <summary>
    /// 水平对齐方式
    /// </summary>
    public XGridAlignment HorizontalAlignment { get; set; } = XGridAlignment.Left;
    /// <summary>
    /// 垂直对齐方式
    /// </summary>
    public XGridAlignment VerticalAlignment { get; set; } = XGridAlignment.Center;

    internal XGridRow Row { get; }
    /// <summary>
    /// 控制边框
    /// </summary>
    public XGridBorder Border { get; } = new XGridBorder();
}
//文本单元格
public class XGridTextCell : XGridCell
{
   /// <summary>
   /// 控制换行
   /// </summary>
   public bool Warp { get; set; } = true;
   /// <summary>
   /// 文本
   /// </summary>
   public string Text { get; set; }
   /// <summary>
   /// 多行文本的行间距
   /// </summary>
   public double LineSpacing { get; set; } = 0;
}
//图像单元格
public class XGridImageCell : XGridCell
{
    /// <summary>
    /// 要在此单元格中渲染的图片。
    /// </summary>
    public XImage Image { get; set; }
    
    public double ImageWidth { get; set; }

    public double ImageHeight { get; set; }
  
}
//边框,对齐,内外边距就略过了。

三、定义保留的API和使用方式

document.DrawPage((page, gfx) =>
{
    var footerFont = new XFont("STSONG.TTF", 18, XFontStyleEx.Bold);
    //绘制网格,指定y轴偏移
    gfx.DrawGrid(100, footerFont, XBrushes.Black, grid =>
    {
        //绘制行
        grid.DrawRow(row =>
        {
            //设置内外边距
            row.Margin.SetHorizontal(100, 100);
            row.DrawTextCell(cell =>
            {
                cell.Text = "你好";
                cell.Border.Visible = true;
                cell.Width = 100;
                cell.VerticalAlignment = XGridAlignment.Top;
                cell.HorizontalAlignment = XGridAlignment.Right;
            });
            row.DrawTextCell(cell =>
            {
                cell.Text = "工程造价咨询报告书工程造价咨询报告书工程造价咨询报告书工程造价咨询报告书工程造价咨询报告书工程造价咨询报告书";
                cell.Border.Visible = true;
                cell.Width = 200;
                cell.Padding = 0;//设置内边距,这里用到了隐式转换语法,Padding 实际是一个class
                cell.HorizontalAlignment = XGridAlignment.Left;
            });
            row.DrawImageCell(cell =>
            {
                cell.Image = XImage.FromFile("./images/hjd.jpg");
                cell.Border.Visible = true;
                cell.Width = 200;
                cell.ImageWidth = 40;
                cell.ImageHeight = 40;
                cell.HorizontalAlignment = XGridAlignment.Center;
                cell.VerticalAlignment = XGridAlignment.Center;
            });
        });
    });
});

四、通过GPT实现

我们将实现思路和定义好的数据结构给他,告诉他需要实现的函数签名即:void DrawGrid(this XGraphics graphics, double y, XFont font, XBrush brush, Action configure)
我们一步步引导完成。省事省力。

五最终效果



标签:Convars,基于,set,get,单元格,cell,new,ChatGPT,public
From: https://www.cnblogs.com/chaeyeon/p/18375782

相关文章

  • java+vue计算机毕设基于智能匹配的体育场馆预约系统APP【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全民健身意识的不断提升和体育产业的蓬勃发展,体育场馆作为承载各类体育活动的重要场所,其供需矛盾日益凸显。传统的人工预约方式不仅效率低下,且难......
  • 基于django+vue汽车维修服务系统【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着汽车保有量的持续增长和消费者对汽车服务质量要求的不断提高,汽车维修服务行业面临着前所未有的机遇与挑战。传统的手工记录与管理方式......
  • 基于django+vue汽车空调管理系统【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着汽车工业的快速发展和人们生活水平的提高,汽车已成为现代生活中不可或缺的重要交通工具。汽车空调作为提升驾乘舒适度的关键系统,其性能......
  • 基于django+vue企业物流管理系统【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球化与电子商务飞速发展的今天,企业物流管理已成为连接生产与销售、提升供应链效率的关键环节。传统的人工或简单信息化管理方式已难以......
  • 基于重要性加权的LLM自我改进:考虑分布偏移的新框架
    LLM自我改进的典型范式是在自生成数据上训练LLM,但是其中的部分数据可能有害,所以应该被过滤掉。但是目前的工作主要采用基于答案正确性的过滤策略,在这篇论文中,证明过滤掉正确但具有高分布偏移程度(DSE)的样本也可以有利于自我改进的结果。论文的主要贡献如下:提出了一个称为......
  • Python3测试mysql插入数据代码(chatgpt生成)
      实现的功能:先连接mysql数据库,然后读取某个目录所有以txt文件命名后缀的json内容文件,解析出对应的key和value,然后插入数据到mysql数据库,最后关闭数据库连接 importosimportjsonimportpymysqlimportre"""尝试插入json文件到MySQL数据库。dbInfo:MySQL数据库......
  • 基于Python flask的图书借阅管理系统的设计与实现
    基于PythonFlask的图书借阅管理系统旨在为图书馆或类似机构提供一个高效、便捷的管理平台,覆盖图书借阅的各个环节,帮助管理员和读者更好地管理和使用图书资源。该系统采用Python编程语言和Flask框架进行开发,结合了数据库管理、用户认证、数据可视化等技术,确保系统的功能完备和......
  • 高效缓存策略——.NET Core 中基于 Redis 的分布式缓存实现
    引言在构建高性能的应用程序时,缓存是不可或缺的技术之一。通过缓存,我们能够显著减少数据库的压力、提升应用的响应速度。而在分布式系统中,分布式缓存则成为了处理高并发和大数据量的理想选择。本文将以Redis为例,介绍如何在.NETCore中实现分布式缓存,帮助开发者打造高效......
  • java+vue计算机毕设基于微信小程序英语在线考试系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已成为人们日常生活中不可或缺的一部分,尤其在教育领域,移动学习因其便捷性、灵活性和高效性正逐步成为学习的新......
  • 基于Springboot的智能菜谱推荐系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的智能菜谱推荐系统(有报告)。Javaee项目,springboot项目。资源下载:基于Springboot的智能菜谱推荐系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven来......