obsidian-excalidraw-plugin

A plugin to edit and view Excalidraw drawings in Obsidian

View on GitHub

◀ Excalidraw Automate How To

实用工具函数

isExcalidrawFile()

isExcalidrawFile(f:TFile): boolean

如果提供的文件是有效的 Excalidraw 文件(可以是传统的 *.excalidraw 文件或在 front-matter 中包含 excalidraw 键的 markdown 文件),则返回 true。

clear()

clear() 将清除缓存中的对象,但会保留元素样式设置。

reset()

reset() 会先调用 clear(),然后将元素样式重置为默认值。

toClipboard()

async toClipboard(templatePath?:string)

将生成的绘图放置到剪贴板中。当你不想创建新的绘图,而是想将额外的元素粘贴到现有绘图上时,这个功能很有用。

getElements()

getElements():ExcalidrawElement[];

以数组形式返回 ExcalidrawAutomate 中的 ExcalidrawElement 元素。这种格式在使用 ExcalidrawRef 时特别有用。

getElement()

getElement(id:string):ExcalidrawElement;

返回与指定 id 匹配的元素对象。如果元素不存在,则返回 null。

create()

async create(params?:{filename: string, foldername:string, templatePath:string, onNewPane: boolean})

创建并打开绘图。返回创建文件的完整路径。

filename 是要创建的绘图文件名(不包含扩展名)。如果为 null,Excalidraw 将自动生成文件名。

foldername 是文件创建的目标文件夹。如果为 null,则会根据 Excalidraw 设置使用默认的新建绘图文件夹。

templatePath 是模板文件的完整路径(包含文件名和扩展名)。该模板文件将作为基础图层,所有通过 ExcalidrawAutomate 添加的对象都会显示在模板元素的上层。如果为 null,则不使用模板,即使用空白画布作为添加对象的基础。

onNewPane 定义新绘图的创建位置。false 将在当前活动页签中打开绘图。true 将通过垂直分割当前页签来打开绘图。

frontmatterKeys 是要应用到文档的 frontmatter 键值集合 { excalidraw-plugin?: “raw”|”parsed”, excalidraw-link-prefix?: string, excalidraw-link-brackets?: boolean, excalidraw-url-prefix?: string }

示例:

create (
  {
    filename:"my drawing", 
    foldername:"myfolder/subfolder/", 
    templatePath: "Excalidraw/template.excalidraw", 
    onNewPane: true, 
    frontmatterKeys: {
      "excalidraw-plugin": "parsed",
      "excalidraw-link-prefix": "",
      "excalidraw-link-brackets": true,
      "excalidraw-url-prefix": "🌐",
    }
  }
);

createSVG()

async createSVG(templatePath?:string)

返回包含生成绘图的 HTML SVGSVGElement 元素。

createPNG()

async createPNG(templatePath?:string, scale:number=1)

返回包含生成绘图的 PNG 图像 blob 对象。

wrapText()

wrapText(text:string, lineLen:number):string

返回一个按照指定最大行长度换行的字符串。

访问打开的 Excalidraw 视图

在使用任何视图操作函数之前,你需要先初始化 targetView。

targetView

targetView: ExcalidrawView

已打开的 Excalidraw 视图,被配置为视图操作的目标。使用 setView 进行初始化。

setView()

setView(view:ExcalidrawView|"first"|"active"):ExcalidrawView

设置将作为视图操作目标的 ExcalidrawView。有效的 view 输入值包括:

getExcalidrawAPI()

getExcalidrawAPI():any

返回在 targetView 中指定的当前活动绘图的原生 Excalidraw API(ref.current)。 查看 Excalidraw 文档请访问:https://www.npmjs.com/package/@excalidraw/excalidraw#ref

getViewElements()

getViewElements():ExcalidrawElement[] 

返回视图中的所有元素。

deleteViewElements()

deleteViewElements(elToDelete: ExcalidrawElement[]):boolean 

从视图中删除与输入参数中提供的元素相匹配的元素。

示例:从视图中删除选中的元素:

ea = ExcalidrawAutomate;
ea.setView("active");
el = ea.getViewSelectedElements();
ea.deleteViewElements();

getViewSelectedElement()

getViewSelectedElement():ExcalidrawElement

首先需要调用 setView() 来设置视图。

如果在目标视图 (targetView) 中选中了一个元素,该函数将返回被选中的元素。如果选中了多个元素(通过 SHIFT+点击 选择多个元素,或者选择一个组),将返回第一个元素。如果你想从一个组中指定要选择的元素,请双击该组中想要的元素。

当你想要添加一个与绘图中现有元素相关的新元素时,这个函数会很有帮助。

getViewSelectedElements()

getViewSelectedElements():ExcalidrawElement[]

首先需要调用 setView() 来设置视图。

获取场景中选中元素的数组。如果没有选中任何元素,则返回 []。

注意:你可以调用 getExcalidrawAPI().getSceneElements() 来获取场景中的所有元素。

viewToggleFullScreen()

viewToggleFullScreen(forceViewMode?:boolean):void;

在目标视图 (targetView) 中切换全屏模式和普通模式。通过将 forceViewMode 设置为 true 可以将 Excalidraw 切换到查看模式。默认值为 false

此功能在 Obsidian 移动端上不生效。

connectObjectWithViewSelectedElement()

connectObjectWithViewSelectedElement(objectA:string,connectionA: ConnectionPoint, connectionB: ConnectionPoint, formatting?:{numberOfPoints?: number,startArrowHead?:string,endArrowHead?:string, padding?: number}):boolean

connectObjects() 功能相同,但 ObjectB 是目标 ExcalidrawView 中当前选中的元素。该函数有助于在新创建的对象和目标 ExcalidrawView 中选中的元素之间放置一个箭头。

addElementsToView()

async addElementsToView(repositionToCursor:boolean=false, save:boolean=false):Promise<boolean>

将使用 ExcalidrawAutomate 创建的元素添加到目标 ExcalidrawView 中。

repositionToCursor 默认值为 false

save 默认值为 false

onDropHook

onDropHook (data: {
  ea: ExcalidrawAutomate, 
  event: React.DragEvent<HTMLDivElement>,
  draggable: any, //Obsidian draggable object
  type: "file"|"text"|"unknown",
  payload: {
    files: TFile[], //TFile[] array of dropped files
    text: string, //string 
  },
  excalidrawFile: TFile, //the file receiving the drop event
  view: ExcalidrawView, //the excalidraw view receiving the drop
  pointerPosition: {x:number, y:number} //the pointer position on canvas at the time of drop
}):boolean;

当可拖拽项被拖放到 Excalidraw 上时触发的回调函数。

该函数应返回一个布尔值。如果拖放由钩子函数处理且应停止进一步的原生处理,则返回 true;如果应让 Excalidraw 继续处理拖放操作,则返回 false。

拖放类型可以是以下之一:

使用 Templater 启动模板或类似方法来设置钩子函数。

ea = ExcalidrawAutomate;
ea.onDropHook = (data) => {
  console.log(data); 
  return false;
}