[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/sketch-mode 4a4e2ba 33/38: Implement import/snippet fun
From: |
ELPA Syncer |
Subject: |
[elpa] externals/sketch-mode 4a4e2ba 33/38: Implement import/snippet functionality |
Date: |
Wed, 15 Sep 2021 16:57:39 -0400 (EDT) |
branch: externals/sketch-mode
commit 4a4e2ba1c791937cfa1107d52497887126a14977
Author: Daniel Nicolai <dalanicolai@gmail.com>
Commit: Daniel Nicolai <dalanicolai@gmail.com>
Implement import/snippet functionality
---
README.org | 9 +-
sketch-mode.el | 376 ++++++---
snippet-files/circuit_components.svg | 1417 ++++++++++++++++++++++++++++++++++
3 files changed, 1701 insertions(+), 101 deletions(-)
diff --git a/README.org b/README.org
index 2dddf7f..43bc237 100644
--- a/README.org
+++ b/README.org
@@ -75,9 +75,10 @@
Add the following lines to =dotspacemacs-additional-packages=
#+begin_src emacs-lisp :tangle yes
- (sketch-mode :location (recipe
- :fetcher github
- :repo "dalanicolai/sketch-mode"))
+ (sketch-mode :location (recipe
+ :fetcher github
+ :repo "dalanicolai/sketch-mode"
+ :files ("*.el" "snippet-files")))
#+end_src
Subsequently load the packages by adding the following line to
=dotspacemacs/user-config=
@@ -93,8 +94,6 @@
package, the usage is more or less self explanatory, it is wise to take note
of the following comments:
- - the undo/redo functionality is really basic, and does not work for all
actions
- (e.g. does not work yet when removing object or cropping images).
- to remove an object (without using undo), you should toggle labels by
pressing =l=, and then to remove an object enter its label after pressing
=R=.
diff --git a/sketch-mode.el b/sketch-mode.el
index 418377a..9c7ca45 100644
--- a/sketch-mode.el
+++ b/sketch-mode.el
@@ -1,13 +1,12 @@
-;; sketch-mode.el --- Quickly create svg sketches using keyboard and mouse -*-
lexical-binding: t; -*-
+;;; sketch-mode.el --- Quickly create svg sketches using keyboard and mouse
-*- lexical-binding: t; -*-
;; Copyright (C) 2021 Free Software Foundation, Inc.
-
;; Author: D.L. Nicolai <dalanicolai@gmail.com>
;; Created: 17 Jul 2021
;; Version: 0
-;; Keywords: multimedia
+;; Keywords: multimedia
;; URL: https://github.com/dalanicolai/sketch-mode
;; This file is not part of GNU Emacs.
@@ -42,6 +41,9 @@
;; TODO add functionality to customize markers
+;; TODO Add options to hide transient suffixes (e.g. commands are trivial and
could be hidden to get more drawing space.
+;; unfortunately transient levels (de)activate instead of hide/show suffixes)
+
;; TODO enable defining global svg settings (object properties)
;; TODO maybe transform relevant transient argument (strings) to variables
@@ -73,6 +75,7 @@
;;; Code:
(require 'svg)
(require 'transient)
+(require 'seq)
(defgroup sketch nil
"Configure default sketch (object) properties."
@@ -107,8 +110,12 @@ default: (800 . 600)."
"Default grid line separation distance (integer)."
:type 'integer)
+(defcustom sketch-label-size 15
+ "Size of object labels."
+ :type 'integer)
+
(defcustom sketch-default-shape 'line
- "Default object type for `sketch-interactively.'"
+ "Default object type for `sketch-interactively'."
:type '(choice
(const :tag "Line" 'line)
(const :tag "Rectangle" 'rectangle)
@@ -121,21 +128,21 @@ If non-nil then snap to grid."
:type 'boolean)
(defcustom sketch-include-start-marker nil
- "Start marker type"
+ "Start marker type."
:type '(choice
(const :tag "No marker" nil)
(const :tag "Arrow" 'arrow)
(const :tag "Dot" 'dot)))
(defcustom sketch-include-mid-marker nil
- "Mid marker type"
+ "Mid marker type."
:type '(choice
(const :tag "No marker" nil)
(const :tag "Arrow" 'arrow)
(const :tag "Dot" 'dot)))
(defcustom sketch-include-end-marker nil
- "End marker type"
+ "End marker type."
:type '(choice
(const :tag "No marker" nil)
(const :tag "Arrow" 'arrow)
@@ -187,7 +194,7 @@ STOPS is a list of percentage/color pairs."
(defun sketch-group (id &rest args)
(apply #'svg-group
:id id
- :transform "translate(0 0)"
+ :transform "translate(0,0)"
args))
(define-minor-mode sketch-mode
@@ -200,7 +207,9 @@ transient."
;; ([sketch drag-mouse-1] . sketch-interactively)
;; ([C-S-drag-mouse-1] . sketch-interactively)
(,(kbd "C-c C-s") . sketch-transient))
- (undo-tree-mode))
+ (if (boundp 'undo-tree-mode)
+ (undo-tree-mode)
+ (buffer-enable-undo)))
(defun sketch-mapcons (fn &rest cons-cells)
"Apply FN to list of car's and cdr's of CONS-CELLS.
@@ -247,7 +256,9 @@ VEC should be a cons or a list containing only number
elements."
(defvar-local show-layers '(0))
(defun sketch--create-canvas (width height &optional grid-parameter)
- "Create canvas for drawing svg using the mouse."
+ "Create canvas of size WIDTH x HEIGHT for drawing svg.
+Optionally set a custom GRID-PARAMETER (default is value of
+`sketch-default-grid-parameter')."
(let ((width width)
(height height))
(setq svg-canvas (svg-create width height :stroke "gray"))
@@ -290,7 +301,7 @@ VEC should be a cons or a list containing only number
elements."
;;;###autoload
(defun sketch (arg)
"Initialize or switch to (new) SVG image.
-With prefix argument, create sketch using default (customizable)
+With prefix ARG, create sketch using default (customizable)
values"
(interactive "P")
(let ((buffer (get-buffer "*sketch*")))
@@ -325,9 +336,9 @@ values"
(car choices))))
(cl-defmethod transient-infix-value ((obj sketch-variable:choices))
- "Return the value of OBJ's `value' slot if not nil,
- else return value of OBJ's `default' slot if not nil,
- else return nil"
+ "Return the value of OBJ's `value' slot if non-nil,
+else return value of OBJ's `default' slot if non-nil,
+else return nil"
(let ((default (oref obj default)))
(if-let ((value (oref obj value)))
(concat (oref obj argument) value)
@@ -458,8 +469,9 @@ values"
[([sketch drag-mouse-1] "Draw object" sketch-interactively-1)
([sketch mouse-1] "Draw text" sketch-text-interactively)
([sketch C-S-drag-mouse-1] "Crop image" sketch-crop)]
- [("T" "Transfrom object" sketch-modify-object)
- ("r" "Remove object" sketch-remove-object)]
+ [("t" "Transform object" sketch-modify-object)
+ ("r" "Remove object" sketch-remove-object)
+ ("i" "Import object" sketch-import)]
[("u" "Undo" sketch-undo)
("U" "Redo" sketch-redo)]
[("d" "Show definition" sketch-show-definition)
@@ -518,10 +530,10 @@ values"
;; (let ((variable (oref obj variable)))
(oset obj value value)
(setq sketch-show-labels value)
- (magit-refresh)
- (sketch-redraw)
- (unless (or value transient--prefix)
- (message "Unset %s" variable)))
+ (auto-revert-buffers)
+ (sketch-redraw))
+ ;; (unless (or value transient--prefix)
+ ;; (message "Unset %s" variable)))
(transient-define-infix sketch-cycle-labels ()
:description "Show labels"
@@ -547,23 +559,35 @@ values"
:x (+ (dom-attr node 'x) 2)
:y (+ (dom-attr node 'y)
(- (dom-attr node 'height) 2))
- :font-size 20
+ :font-size sketch-label-size
:stroke "red"
:fill "red"))
('line (svg-text svg-labels
(dom-attr node 'id)
:x (dom-attr node 'x1)
:y (dom-attr node 'y1)
- :font-size 20
+ :font-size sketch-label-size
:stroke "red"
:fill "red"))
((or 'circle 'ellipse) (svg-text svg-labels
(dom-attr node 'id)
:x (dom-attr node 'cx)
:y (dom-attr node 'cy)
- :font-size 20
+ :font-size sketch-label-size
:stroke "red"
- :fill "red"))))
+ :fill "red"))
+ ('g (let ((s (dom-attr node
+ 'transform)))
+ (string-match "translate\(\\([0-9]*\\)[, ]*\\([0-9]*\\)" s)
+ (let ((x (match-string 1 s))
+ (y (match-string 2 s)))
+ (svg-text svg-labels
+ (dom-attr node 'id)
+ :x x
+ :y y
+ :font-size sketch-label-size
+ :stroke "red"
+ :fill "red"))))))
nodes)
svg-labels))
@@ -591,7 +615,8 @@ values"
("line" "l")
("rectangle" "r")
("circle" "c")
- ("ellipse" "e"))))
+ ("ellipse" "e")
+ ("group" "g"))))
(idx 0)
(label (concat prefix (number-to-string idx)))
(labels (sketch-labels-list)))
@@ -658,7 +683,7 @@ values"
;; (if-let (buf (get-buffer"*sketch-root*"))
;; (sketch-update-lisp-window sketch-root buf)
;; (sketch-update-lisp-window lisp lisp-buffer))))
- (setq sketch-root (append (subseq sketch-root 0 2) (list (nth (car
show-layers) sketch-layers-list))))
+ (setq sketch-root (append (seq-subseq sketch-root 0 2) (list (nth (car
show-layers) sketch-layers-list))))
(dolist (layer (cdr show-layers))
(setq sketch-root (append sketch-root (list (nth layer
sketch-layers-list)))))
(setq sketch-svg (append svg-canvas
@@ -680,6 +705,7 @@ values"
(cddr coords)))))))))
(prin1-to-string sketch-root))))
+
(transient-define-suffix sketch-interactively-1 (event)
(interactive "@e")
(let* ((args (when transient-current-prefix (transient-args
'sketch-transient)))
@@ -728,6 +754,42 @@ values"
(sketch-labels-list)))
(sketch-redraw))
+(transient-define-suffix sketch-insert-snippet (event)
+ (interactive "@e")
+ (let ((coords (posn-object-x-y (event-start event)))
+ (node (oref transient-current-prefix value))
+ (label (sketch-create-label "group")))
+ (dom-set-attribute node
+ 'transform
+ (format "translate(%s,%s)" (car coords) (cdr coords)))
+ (dom-set-attribute node
+ 'id
+ label)
+ (dom-append-child (nth active-layer sketch-layers-list) node)
+ (sketch-redraw)
+ (sketch-modify-object label)))
+
+(transient-define-prefix sketch-import (svg-file)
+ [([sketch mouse-1] "Insert snippet" sketch-insert-snippet)]
+ (interactive (list (let ((default-directory (concat
+ (file-name-directory
(locate-library "sketch-mode"))
+ "snippet-files/")))
+ (read-file-name "Import (object) from file: "))))
+ (let* ((dom (sketch-snippet-get-dom svg-file))
+ (has-groups (dom-by-tag dom 'g)))
+ (when has-groups (sketch-snippets-add-labels dom))
+ (let* ((idx (when has-groups (read-number "Number of object for import:
")))
+ (snippet (if (dom-by-tag dom 'g)
+ (dom-elements dom 'id (number-to-string idx))
+ (list (dom-append-child
+ (sketch-group (sketch-create-label "group"))
+ (car (dom-children dom)))))))
+ (sketch-redraw)
+ (transient-setup 'sketch-import nil nil :value (car snippet)))))
+
+;; (transient-define-suffix sketch-import-object (svg-file)
+;; (interactive "fImport object from file: ")
+
(define-minor-mode sketch-lisp-mode
"Minor mode for svg lisp buffers."
:lighter "sketch"
@@ -769,21 +831,31 @@ values"
;; (defvar sketch-undo-redo nil)
-(transient-define-suffix sketch-undo ()
- (interactive)
- (undo-tree-undo)
+(transient-define-suffix sketch-undo (&optional count)
+ (interactive "*p")
+ (cond ((fboundp 'evil-undo)
+ (evil-undo count))
+ ((fboundp 'undo-tree-undo)
+ (undo-tree-undo))
+ (t (undo)))
(setq sketch-root (read (buffer-string)))
- (setq sketch-layers-list (dom-elements sketch-root 'id "layer")))
+ (setq sketch-layers-list (dom-elements sketch-root 'id "layer"))
+ (unless sketch-layers-list (sketch-add-layer)))
;; (let ((sketch-reverse (nreverse sketch-root)))
;; (push (pop sketch-reverse) sketch-undo-redo)
;; (setq sketch-root (nreverse sketch-reverse)))
;; (sketch-redraw))
-(transient-define-suffix sketch-redo ()
- (interactive)
- (undo-tree-redo)
+(transient-define-suffix sketch-redo (count)
+ (interactive "*p")
+ (cond ((fboundp 'evil-undo)
+ (evil-redo count))
+ ((fboundp 'undo-tree-redo)
+ (undo-tree-redo))
+ (t (user-error "This command requires `undo-tree' or `evil' to be
available")))
(setq sketch-root (read (buffer-string)))
- (setq sketch-layers-list (dom-elements sketch-root 'id "layer")))
+ (setq sketch-layers-list (dom-elements sketch-root 'id "layer"))
+ (unless sketch-layers-list (sketch-add-layer)))
;; (let ((sketch-reverse (nreverse sketch-root)))
;; (push (pop sketch-undo-redo) sketch-reverse)
;; (setq sketch-root (nreverse sketch-reverse)))
@@ -813,7 +885,7 @@ values"
;; (if sketch-include-end-marker
;; "url(#arrow)"
;; "none"))))
- (apply #'svg-text sketch-root text :x (car coords) :y (cdr coords)
object-props))
+ (apply #'svg-text (nth active-layer sketch-layers-list) text :x (car
coords) :y (cdr coords) object-props))
(sketch-redraw))
(transient-define-infix sketch-select-font ()
@@ -914,7 +986,7 @@ that should be added to the image. Initial value: (0)"
(setq svg-canvas (svg-create new-width new-height :stroke "gray"))
(svg-marker svg-canvas "arrow" 8 8 "black" t)
(svg-rectangle svg-canvas 0 0 new-width new-height :fill "white")
- (setq sketch-root (svg-translate "root" (car start-coords) (cdr
start-coords)))
+ (setq sketch-root (sketch--svg-translate (car start-coords) (cdr
start-coords)))
(sketch-redraw)))
(defun sketch-image (svg &rest props)
@@ -941,40 +1013,147 @@ PROPS is passed on to `create-image' as its PROPS list."
(cl-incf (alist-get coord props) amount))
(sketch-redraw object-def buffer))
+(defun sketch-parse-transform-value (value)
+ (let ((transforms (mapcar (lambda (val)
+ (split-string val "[(,)]" t))
+ (split-string value))))
+ (mapcar (lambda (x)
+ (cons (intern (car x)) (mapcar (lambda (val)
+ (string-to-number val))
+ (cdr x))))
+ transforms)))
+
+(defun sketch-format-transfrom-value (value)
+ (string-join (mapcar (lambda (x) (concat (symbol-name (car x))
+ "("
+ (number-to-string (cadr x))
+ (if-let (y (caddr x))
+ (concat "," (number-to-string
y)))
+ ")"))
+ value)
+ " "))
+
+(defun sketch-group-translate (buffer object-def direction &optional fast)
+ (let ((transform (sketch-parse-transform-value
+ (dom-attr object-def
+ 'transform)))
+ (amount (if fast
+ 10
+ 1)))
+ (pcase direction
+ ('up (cl-decf (cadr (alist-get 'translate transform)) amount))
+ ('down (cl-incf (cadr (alist-get 'translate transform)) amount)))
+ (dom-set-attribute object-def
+ 'transform
+ (sketch-format-transfrom-value transform))
+ (sketch-redraw object-def buffer)))
+
+(defun sketch-group-scale (buffer object-def direction &optional fast)
+ (let ((transform (sketch-parse-transform-value
+ (dom-attr object-def
+ 'transform)))
+ (amount (if fast
+ 1
+ 0.1)))
+ (unless (alist-get 'scale transform)
+ (push '(scale 1) transform))
+ (pcase direction
+ ('up (cl-incf (car (alist-get 'scale transform)) amount))
+ ('down (cl-decf (car (alist-get 'scale transform)) amount)))
+ (dom-set-attribute object-def
+ 'transform
+ (sketch-format-transfrom-value transform))
+ (sketch-redraw object-def buffer)))
+
+(transient-define-suffix sketch-group-scale-up (args)
+ (interactive (list (oref transient-current-prefix value)))
+ (let* ((object (transient-arg-value "--object=" args))
+ (buffer (transient-arg-value "--buffer=" args))
+ (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+ (sketch-group-scale buffer (car object-def) 'up)))
+
+(transient-define-suffix sketch-group-scale-up-fast (args)
+ (interactive (list (oref transient-current-prefix value)))
+ (let* ((object (transient-arg-value "--object=" args))
+ (buffer (transient-arg-value "--buffer=" args))
+ (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+ (sketch-group-scale buffer (car object-def) 'up t)))
+
+(transient-define-suffix sketch-group-scale-down (args)
+ (interactive (list (oref transient-current-prefix value)))
+ (let* ((object (transient-arg-value "--object=" args))
+ (buffer (transient-arg-value "--buffer=" args))
+ (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+ (sketch-group-scale buffer (car object-def) 'down)))
+
+(transient-define-suffix sketch-group-scale-down-fast (args)
+ (interactive (list (oref transient-current-prefix value)))
+ (let* ((object (transient-arg-value "--object=" args))
+ (buffer (transient-arg-value "--buffer=" args))
+ (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+ (sketch-group-scale buffer (car object-def) 'down t)))
+
+
;; TODO 'refactor' subsequent suffixes (e.g. create general function/macro)
(transient-define-suffix sketch-translate-down (args)
- (interactive (list (oref transient-current-prefix :value)))
+ (interactive (list (oref transient-current-prefix value)))
(let* ((object (transient-arg-value "--object=" args))
(buffer (transient-arg-value "--buffer=" args))
(object-def (dom-by-id sketch-svg (format "^%s$" object)))
(props (cadar object-def)))
- (sketch-translate-object buffer object-def props '(y1 y2) 1)))
+ (if (eq (caar object-def) 'g)
+ (sketch-group-translate buffer (car object-def) 'down)
+ (sketch-translate-object buffer
+ object-def
+ props
+ '(y1 y2) 1))))
(transient-define-suffix sketch-translate-fast-down (args)
- (interactive (list (oref transient-current-prefix :value)))
+ (interactive (list (oref transient-current-prefix value)))
(let* ((object (transient-arg-value "--object=" args))
(buffer (transient-arg-value "--buffer=" args))
(object-def (dom-by-id sketch-svg (format "^%s$" object)))
(props (cadar object-def)))
- (sketch-translate-object buffer object-def props '(y1 y2) 10)))
+ (if (eq (caar object-def) 'g)
+ (sketch-group-translate buffer (car object-def) 'down t)
+ (sketch-translate-object buffer
+ object-def
+ props
+ (pcase (caar object-def)
+ ('line '(y1 y2)))
+ 10))))
(transient-define-suffix sketch-translate-up (args)
- (interactive (list (oref transient-current-prefix :value)))
+ (interactive (list (oref transient-current-prefix value)))
(let* ((object (transient-arg-value "--object=" args))
(buffer (transient-arg-value "--buffer=" args))
(object-def (dom-by-id sketch-svg (format "^%s$" object)))
(props (cadar object-def)))
- (sketch-translate-object buffer object-def props '(y1 y2) -1)))
+ (if (eq (caar object-def) 'g)
+ (sketch-group-translate buffer (car object-def) 'up)
+ (sketch-translate-object buffer
+ object-def
+ props
+ (pcase (caar object-def)
+ ('line '(y1 y2)))
+ -1))))
(transient-define-suffix sketch-translate-fast-up (args)
- (interactive (list (oref transient-current-prefix :value)))
+ (interactive (list (oref transient-current-prefix value)))
(let* ((object (transient-arg-value "--object=" args))
(buffer (transient-arg-value "--buffer=" args))
(object-def (dom-by-id sketch-svg (format "^%s$" object)))
(props (cadar object-def)))
- (sketch-translate-object buffer object-def props '(y1 y2) -10)))
-
-(transient-define-prefix sketch-modify-object ()
+ (if (eq (caar object-def) 'g)
+ (sketch-group-translate buffer (car object-def) 'up t)
+ (sketch-translate-object buffer
+ object-def
+ props
+ (pcase (caar object-def)
+ ('line '(y1 y2)))
+ -10))))
+
+(transient-define-prefix sketch-modify-object (&optional group)
"Set object properties."
:transient-suffix 'transient--do-call
["Properties"
@@ -982,12 +1161,16 @@ PROPS is passed on to `create-image' as its PROPS list."
[[("<down>" "down" sketch-translate-down)
("<up>" "up" sketch-translate-up)]
[("S-<down>" "fast down" sketch-translate-fast-down)
- ("S-<up>" "fast up" sketch-translate-fast-up)]]
+ ("S-<up>" "fast up" sketch-translate-fast-up)]
+ [("u" "scale up" sketch-group-scale-up)
+ ("d" "scale up" sketch-group-scale-down)]]
[("l" sketch-cycle-labels)
("q" "Quit" transient-quit-one)]
(interactive)
- (let* ((object (completing-read "Transform element with id: "
- (sketch-labels-list)))
+ (let* ((object (if group
+ group
+ (completing-read "Transform element with id: "
+ (sketch-labels-list))))
(buffer (get-buffer-create (format "*sketch-object-%s*" object))))
(display-buffer buffer '(display-buffer-in-side-window . ((side . right)
(window-width . 70))))
(pp (cadar (dom-by-id sketch-svg (format "^%s$" object))) buffer)
@@ -1004,61 +1187,62 @@ PROPS is passed on to `create-image' as its PROPS list."
(with-current-buffer buffer
(erase-buffer)
(pp lisp (current-buffer))
- (end-of-buffer)))
+ (goto-char (point-max))))
;;; import/snippets
+(defun sketch-snippet-get-dom (svg-file)
+ (interactive "fCreate dom from file: ")
+ (with-temp-buffer "svg"
+ (insert-file-contents-literally svg-file)
+ (xml-remove-comments (point-min) (point-max))
+ (libxml-parse-xml-region (point-min) (point-max))))
+
(defun sketch-snippets-add-ids (dom)
(let ((idx 0))
(dolist (n (dom-by-tag dom 'g))
(dom-set-attribute n 'id (number-to-string idx))
(setq idx (1+ idx)))))
-(defun sketch-snippets-add-labels (svg-file)
+(defun sketch-snippets-add-labels (dom)
(interactive "f")
- (let (dom)
- (with-temp-buffer "svg"
- (insert-file-contents-literally svg-file)
- (xml-remove-comments (point-min) (point-max))
- (setq dom (libxml-parse-xml-region (point-min)
(point-max)))
- (sketch-snippets-add-ids dom))
- (mapc (lambda (n)
- (let* ((s (dom-attr n 'transform))
- (coords (when s
- (split-string
- (string-trim
- s
- "translate(" ")")
- ","))))
- (svg-text dom
- (dom-attr n 'id)
- :x (car coords)
- :y (cadr coords)
- :font-size 10
- :stroke "red"
- :fill "red")))
- (cdr (dom-by-tag dom 'g)))
- (unless sketch-mode
- (user-error "Not in sketch-mode buffer"))
- ;; (save-current-buffer
- ;; (when lisp-buffer
- ;; (sketch-update-lisp-window lisp lisp-buffer))
- ;; (let ((lisp-window (or (get-buffer-window "*sketch-root*")
- ;; (get-buffer-window lisp-buffer))))
- ;; (unless (string= (buffer-name (window-buffer lisp-window))
"*sketch*")
- ;; (if-let (buf (get-buffer"*sketch-root*"))
- ;; (sketch-update-lisp-window sketch-root buf)
- ;; (sketch-update-lisp-window lisp lisp-buffer))))
- ;; (setq sketch-root (append (subseq sketch-root 0 2) (list (nth (car
show-layers) svg-layers))))
- ;; (dolist (layer (cdr show-layers))
- ;; (setq sketch-root (append sketch-root (list (nth layer
svg-layers)))))
- ;; (setq sketch-svg (append svg-canvas
- ;; (when sketch-show-grid (list sketch-grid))
- ;; (when sketch-show-labels (list
(sketch-labels)))
- ;; (list sketch-root)))
- (erase-buffer) ;; a (not exact) alternative is to use (kill-backward-chars
1)
- (insert-image (svg-image dom))
- (print dom)))
-
- (provide 'sketch-mode)
+ (sketch-snippets-add-ids dom)
+ (mapc (lambda (n)
+ (let* ((s (dom-attr n 'transform))
+ (coords (when s
+ (split-string
+ (string-trim
+ s
+ "translate(" ")")
+ ","))))
+ (svg-text dom
+ (dom-attr n 'id)
+ :x (car coords)
+ :y (cadr coords)
+ :font-size 10
+ :stroke "red"
+ :fill "red")))
+ (cdr (dom-by-tag dom 'g)))
+ (unless sketch-mode
+ (user-error "Not in sketch-mode buffer"))
+ ;; (save-current-buffer
+ ;; (when lisp-buffer
+ ;; (sketch-update-lisp-window lisp lisp-buffer))
+ ;; (let ((lisp-window (or (get-buffer-window "*sketch-root*")
+ ;; (get-buffer-window lisp-buffer))))
+ ;; (unless (string= (buffer-name (window-buffer lisp-window)) "*sketch*")
+ ;; (if-let (buf (get-buffer"*sketch-root*"))
+ ;; (sketch-update-lisp-window sketch-root buf)
+ ;; (sketch-update-lisp-window lisp lisp-buffer))))
+ ;; (setq sketch-root (append (seq-subseq sketch-root 0 2) (list (nth (car
show-layers) svg-layers))))
+ ;; (dolist (layer (cdr show-layers))
+ ;; (setq sketch-root (append sketch-root (list (nth layer svg-layers)))))
+ ;; (setq sketch-svg (append svg-canvas
+ ;; (when sketch-show-grid (list sketch-grid))
+ ;; (when sketch-show-labels (list (sketch-labels)))
+ ;; (list sketch-root)))
+ (erase-buffer) ;; a (not exact) alternative is to use (kill-backward-chars 1)
+ (insert-image (svg-image dom)))
+
+(provide 'sketch-mode)
;;; sketch-mode.el ends here
diff --git a/snippet-files/circuit_components.svg
b/snippet-files/circuit_components.svg
new file mode 100644
index 0000000..5065cf5
--- /dev/null
+++ b/snippet-files/circuit_components.svg
@@ -0,0 +1,1417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- created using Vector Blocks (http://bretmulvey.com/VectorBlocks) -->
+<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="2560">
+ <g stroke="#000" stroke-width="2">
+ <path d="m 1200.8104133605957,1098.3416372085921 16,0"/>
+ <path d="m 720.8104133605957,1178.3416372085921 16,0"/>
+ <path d="m 720.8104133605957,1162.3416372085921 16,0"/>
+ <path d="m 144.8104133605957,250.34163720859215 16,0"/>
+ </g>
+ <g transform="translate(0.8104133605957031 2.3416372085921466)"
style="font-family: Sans-Serif" stroke-width="2" stroke="#000" fill="none">
+ <text stroke="none" fill="#000" x="40" y="48" style="font-size:
16pt;text-anchor: start;font-weight: normal;">Vector Blocks Component
Gallery</text>
+ <text stroke="none" fill="#000" x="40" y="78" style="font-size:
12pt;text-anchor: start;font-weight: normal;">From Vector Blocks browser-based
circuit schematic editor at http://bretmulvey.com/VectorBlocks</text>
+ <text stroke="none" fill="#000" x="40" y="108" style="font-size:
8pt;text-anchor: start;font-weight: normal;">License: Creative Commons
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) </text>
+ <text stroke="none" fill="#000" x="40" y="124" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Schematics created using these
components or derivates, or created using the Vector Blocks application,</text>
+ <text stroke="none" fill="#000" x="40" y="140" style="font-size:
8pt;text-anchor: start;font-weight: normal;">do not require attribution.
Schematic drawing applications that incorporate these components as part of
a</text>
+ <text stroke="none" fill="#000" x="40" y="156" style="font-size:
8pt;text-anchor: start;font-weight: normal;">graphics library require
attribution as follows: "Some schematic symbols are derived from Vector Blocks
at</text>
+ <text stroke="none" fill="#000" x="40" y="172" style="font-size:
8pt;text-anchor: start;font-weight:
normal;">http://bretmulvey.com/VectorBlocks"</text>
+ <text stroke="none" fill="#000" x="200" y="252" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Simple wire</text>
+ <g transform="translate(112, 240)">
+ <path d="m 8,16 0,-8 8,0"/>
+ </g>
+ <g transform="translate(80, 240)">
+ <path d="m 8,0 0,16"/>
+ <path d="m 8,8 8,0"/>
+ <circle fill="#000" stroke="none" cy="8" cx="8" r="3"/>
+ </g>
+ <g transform="translate(48, 240)">
+ <path d="m 0,8 16,0"/>
+ <path d="m 8,0 0,16"/>
+ <circle fill="#000" stroke="none" cy="8" cx="8" r="3"/>
+ </g>
+ <g transform="translate(48, 272)">
+ <path d="m 0,8 16,0"/>
+ <path d="m 8,0 0,6"/>
+ <path d="m 8,16 0,-6"/>
+ </g>
+ <g transform="translate(112, 272)">
+ <path d="m 0,8 8,0 32,32 8,0"/>
+ <path d="m 0,40 8,0 14,-14"/>
+ <path d="m 48,8 -8,0 -14,14"/>
+ </g>
+ <g transform="translate(112, 336)">
+ <path d="m 0,8 8,0 32,32 0,8"/>
+ <path d="m 0,40 8,0 14,-14"/>
+ <path d="m 40,0 0,8 -14,14"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="284" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Cross-overs</text>
+ <g fill="none" stroke-dasharray="1 2 2 2 2 2 2 2 1"
transform="translate(144, 400)">
+ <path d="m 0,8 16,0"/>
+ </g>
+ <g fill="none" stroke-dasharray="1 2 2 2 2 2 2 2 1"
transform="translate(112, 400)">
+ <path d="m 8,16 0,-8 8,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="412" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Dotted wire</text>
+ <g transform="translate(144, 432) matrix(-1, 0, 0, -1, 16, 16)">
+ <path d="m 0,8 16,0"/>
+ <path stroke-dasharray="2" d="m 7,0 10,0"/>
+ <path stroke-dasharray="2" d="m 7,16 10,0"/>
+ <ellipse ry="8" rx="4" cy="8" cx="8"/>
+ </g>
+ <g transform="translate(112, 432)">
+ <path d="m 0,8 16,0"/>
+ <path stroke-dasharray="2" d="m -1,0 18,0"/>
+ <path stroke-dasharray="2" d="m -1,16 18,0"/>
+ </g>
+ <g fill="#000" transform="translate(80, 432)">
+ <path d="m 0,8 16,0"/>
+ <path stroke-dasharray="2" d="m -1,0 18,0"/>
+ <path stroke-dasharray="2" d="m -1,16 18,0"/>
+ <circle cy="16" cx="8" r="2"/>
+ <path d="m 8,16 0,16"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="444" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Shielded wire</text>
+ <g transform="translate(144, 480)">
+ <path d="m 16,8 -2,0"/>
+ <path stroke-linejoin="bevel" d="m 7,2 8,6 -8,6"/>
+ </g>
+ <g transform="translate(128, 480)">
+ <path d="m 0,8 8,0"/>
+ <path d="m 1,2 8,6 -8,6"/>
+ </g>
+ <g transform="translate(80, 480)">
+ <path d="m 16,8 -1,0"/>
+ <path d="m 10,2 a 6.3,6.3 0 0 1 0,12"/>
+ </g>
+ <g transform="translate(64, 480)">
+ <path d="m 0,8 5,0"/>
+ <circle fill="#FFF" cy="8" cx="8" r="3"/>
+ </g>
+ <g transform="translate(144, 512) matrix(-1, 0, 0, -1, 16, 16)">
+ <path d="m 0,8 6,0"/>
+ <path d="m 6,0 a 8,8 0 0 0 0,8 a 8,8 0 0 1 0,8"/>
+ </g>
+ <g transform="translate(128, 512)">
+ <path d="m 0,8 6,0"/>
+ <path d="m 6,0 a 8,8 0 0 0 0,8 a 8,8 0 0 1 0,8"/>
+ </g>
+ <g fill="#FFF" transform="translate(80, 512)">
+ <path d="m 0,8 5,0"/>
+ <rect y="5" x="5" height="6" width="6"/>
+ </g>
+ <g fill="#000" transform="translate(48, 512)">
+ <path d="m 0,8 5,0"/>
+ <rect y="5" x="5" height="6" width="6"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="492" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Termination points</text>
+ <g transform="translate(112, 544)">
+ <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="556" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Resistor</text>
+ <g transform="translate(48, 544)">
+ <path d="m 0,8 48,0"/>
+ <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+ </g>
+ <g transform="translate(112, 576)">
+ <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+ <path d="m 15,17 19,-19"/>
+ <path d="m 29,-3 6,6 2,-8" fill="#000" stroke="none"/>
+ </g>
+ <g transform="translate(48, 576)">
+ <path d="m 0,8 48,0"/>
+ <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+ <path d="m 15,17 19,-19"/>
+ <path d="m 29,-3 6,6 2,-8" fill="#000" stroke="none"/>
+ </g>
+ <g transform="translate(112, 608)">
+ <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+ <path d="m 19,-2 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 18,0 0,-7.5 6,3 z"/>
+ <path d="m 27,-2 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 26,0 0,-7.5 6,3 z"/>
+ </g>
+ <g transform="translate(48, 608)">
+ <path d="m 0,8 48,0"/>
+ <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+ <path d="m 19,-2 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 18,0 0,-7.5 6,3 z"/>
+ <path d="m 27,-2 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 26,0 0,-7.5 6,3 z"/>
+ </g>
+ <g transform="translate(112, 640)">
+ <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+ <path d="m 7,17 8,0 19,-19"/>
+ </g>
+ <g transform="translate(48, 640)">
+ <path d="m 0,8 48,0"/>
+ <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+ <path d="m 7,17 8,0 19,-19"/>
+ </g>
+ <g transform="translate(112, 672)">
+ <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+ <path d="m 24,32 0,-12"/>
+ <path fill="#000" stroke="none" d="m 24,13 4,8 -8,0 z"/>
+ </g>
+ <g transform="translate(48, 672)">
+ <path d="m 0,8 48,0"/>
+ <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+ <path d="m 24,32 0,-12"/>
+ <path fill="#000" stroke="none" d="m 24,13 4,8 -8,0 z"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="588" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Variable resistor</text>
+ <text stroke="none" fill="#000" x="200" y="620" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Photoresistor</text>
+ <text stroke="none" fill="#000" x="200" y="652" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Thermistor</text>
+ <text stroke="none" fill="#000" x="200" y="684" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Potentiometer</text>
+ <g transform="translate(112, 720)">
+ <path d="m 0,8 21,0"/>
+ <path d="m 21,0 0,16"/>
+ <path d="m 27,0 0,16"/>
+ <path d="m 27,8 21,0"/>
+ </g>
+ <g transform="translate(48, 720)">
+ <path d="m 0,8 20,0"/>
+ <path stroke-width="6" d="m 19,-2 0,20"/>
+ <path stroke-width="6" d="m 29,-2 0,20"/>
+ <path d="m 48,8 -20,0"/>
+ </g>
+ <g transform="translate(112, 752)">
+ <path d="m 0,8 22,0"/>
+ <path d="m 21,0 a 20,20 0 0 1 0,16"/>
+ <path d="m 27,0 0,16"/>
+ <path d="m 48,8 -21,0"/>
+ <path d="m 32,-2 8,0"/>
+ <path d="m 36,-6 0,8"/>
+ </g>
+ <g transform="translate(48, 752)">
+ <path d="m 0,8 17,0"/>
+ <rect height="18" width="4" y="-1" x="27" fill="#FFF"/>
+ <path stroke-width="6" d="m 19,-2 0,20"/>
+ <path d="m 48,8 -17,0"/>
+ <path d="m 34,-2 8,0"/>
+ <path d="m 38,-6 0,8"/>
+ </g>
+ <g transform="translate(112, 784)">
+ <path d="m 0,8 21,0"/>
+ <path d="m 21,0 0,16"/>
+ <path d="m 27,0 0,16"/>
+ <path d="m 48,8 -21,0"/>
+ <path d="m 15,17 19,-19"/>
+ <path d="m 29,-3 6,6 2,-8" fill="#000" stroke="none"/>
+ </g>
+ <g transform="translate(48, 784)">
+ <path d="m 0,8 20,0"/>
+ <path stroke-width="6" d="m 19,-2 0,20"/>
+ <path stroke-width="6" d="m 29,-2 0,20"/>
+ <path d="m 48,8 -20,0"/>
+ <path d="m 12,20 24,-24"/>
+ <path d="m 31,-5 6,6 2,-8" fill="#000" stroke="none"/>
+ </g>
+ <g transform="translate(112, 816)">
+ <path d="m 0,8 48,0"/>
+ <circle fill="#FFF" cy="8" cx="8" r="3"/>
+ <circle fill="#FFF" cy="8" cx="40" r="3"/>
+ <path d="m 16,4 16,0"/>
+ <path d="m 16,12 16,0"/>
+ <path d="m 24,12 0,20"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="732" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Capacitor, unpolarized</text>
+ <text stroke="none" fill="#000" x="200" y="764" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Polarized capacitor</text>
+ <text stroke="none" fill="#000" x="200" y="796" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Variable capacitor</text>
+ <text stroke="none" fill="#000" x="200" y="828" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Feed-through capacitor</text>
+ <g transform="translate(112, 864)">
+ <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0
a 3,4 0 0 1 8,0 l 8,0"/>
+ </g>
+ <g transform="translate(48, 864)">
+ <path d="m 8,16 0,-8 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1
8,0 a 3,4 0 0 1 8,0 l 0,8"/>
+ </g>
+ <g transform="translate(112, 896)">
+ <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0
a 3,4 0 0 1 8,0 l 8,0"/>
+ <path d="m 12,20 24,-24"/>
+ <path d="m 31,-5 6,6 2,-8" fill="#000" stroke="none"/>
+ </g>
+ <g transform="translate(112, 928)">
+ <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0
a 3,4 0 0 1 8,0 l 8,0"/>
+ <path d="m 24,8 0,8"/>
+ </g>
+ <g transform="translate(48, 928)">
+ <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0
a 3,4 0 0 1 8,0 l 0,8"/>
+ </g>
+ <g transform="translate(80, 960)">
+ <path d="m 8,16 0,-8 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1
8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1
8,0 l 0,8"/>
+ </g>
+ <g transform="translate(128, 992)">
+ <path d="m 8,5 16,0"/>
+ <path d="m 8,11 16,0"/>
+ </g>
+ <g fill="none" stroke-dasharray="0 2 4 4 4 2"
transform="translate(128, 1024)">
+ <path d="m 8,5 16,0"/>
+ <path d="m 8,11 16,0"/>
+ </g>
+ <g fill="#000" stroke="none" transform="translate(144, 1056)">
+ <circle cy="0" cx="16" r="3"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="876" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Inductor</text>
+ <text stroke="none" fill="#000" x="200" y="908" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Variable inductor</text>
+ <text stroke="none" fill="#000" x="200" y="940" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Tapped inductor</text>
+ <text stroke="none" fill="#000" x="200" y="972" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Longer-winding inductor</text>
+ <text stroke="none" fill="#000" x="200" y="1004" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Iron core</text>
+ <text stroke="none" fill="#000" x="200" y="1036" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Ferrite core</text>
+ <text stroke="none" fill="#000" x="200" y="1068" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Polarity dot</text>
+ <g fill="#000" transform="translate(112, 1088)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ </g>
+ <g fill="#000" transform="translate(112, 1120)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 19,-1 4.5,-9"/>
+ <path stroke="none" d="m 24.5,-12 0,7.5 -6,-3 z"/>
+ <path d="m 27,1 4.5,-9"/>
+ <path stroke="none" d="m 32.5,-10 0,7.5 -6,-3 z"/>
+ </g>
+ <g fill="#000" transform="translate(112, 1152)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 20,-3 4.5,-9"/>
+ <path stroke="none" d="m 19,-1 0,-7.5 6,3 z"/>
+ <path d="m 28,-2 4.5,-9"/>
+ <path stroke="none" d="m 27,0 0,-7.5 6,3 z"/>
+ </g>
+ <g fill="#000" transform="translate(112, 1184)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path fill="none" d="m 36,-2 -4.5,2 1,16 -4.5,2"/>
+ </g>
+ <g fill="#000" transform="translate(112, 1216)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path fill="none" d="m 35.5,0 a 2,2 0 0 0 -4,0"/>
+ <path stroke-linecap="round" d="m 31.5,0 1,16"/>
+ <path fill="none" d="m 32.5,16 a 2,2 0 0 1 -4,0"/>
+ </g>
+ <g fill="#000" transform="translate(112, 1248)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path fill="none" d="m 28,0 4,0 0,16 -4,0"/>
+ </g>
+ <g fill="#000" transform="translate(112, 1280)">
+ <path d="m 0,8 32,0"/>
+ <path d="m 36,8 12,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 36,0 0,16"/>
+ </g>
+ <g fill="#000" transform="translate(112, 1312)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 36,0 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1088)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1120)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 19,-1 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 24.5,-12 0,7.5 -6,-3 z"/>
+ <path d="m 27,1 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 32.5,-10 0,7.5 -6,-3 z"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1152)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 20,-3 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 19,-1 0,-7.5 6,3 z"/>
+ <path d="m 28,-2 4.5,-9"/>
+ <path fill="#000" stroke="none" d="m 27,0 0,-7.5 6,3 z"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1184)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path fill="none" d="m 36,-2 -4.5,2 1,16 -4.5,2"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1216)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path fill="none" d="m 35.5,0 a 2,2 0 0 0 -4,0"/>
+ <path stroke-linecap="round" d="m 31.5,0 1,16"/>
+ <path fill="none" d="m 32.5,16 a 2,2 0 0 1 -4,0"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1248)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path fill="none" d="m 28,0 4,0 0,16 -4,0"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1280)">
+ <path d="m 0,8 32,0"/>
+ <path d="m 36,8 12,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 36,0 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(48, 1312)">
+ <path d="m 0,8 48,0"/>
+ <path d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 36,0 0,16"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="1100" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Diode</text>
+ <text stroke="none" fill="#000" x="200" y="1132" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Light-emitted diode (LED)</text>
+ <text stroke="none" fill="#000" x="200" y="1164" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Photodiode</text>
+ <text stroke="none" fill="#000" x="200" y="1196" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Zener diode</text>
+ <text stroke="none" fill="#000" x="200" y="1228" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Schottky diode</text>
+ <text stroke="none" fill="#000" x="200" y="1260" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Tunnel diode</text>
+ <text stroke="none" fill="#000" x="200" y="1292" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Varicap</text>
+ <text stroke="none" fill="#000" x="200" y="1324" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Pin diode</text>
+ <g transform="translate(112, 1360)">
+ <path d="m 0,8 48,0"/>
+ <path fill="#000" d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 32,8 8,-6 0,-18"/>
+ </g>
+ <g transform="translate(112, 1408)">
+ <path d="m 0,8 16,0"/>
+ <path d="m 48,8 -16,0"/>
+ <path fill="#000" d="m 30,2 -14,-7 0,14 z"/>
+ <path fill="#000" d="m 18,14 14,-7 0,14 z"/>
+ <path d="m 32,-8 0,32"/>
+ <path d="m 16,-8 0,32"/>
+ <path d="m 32,2 8,-6 0,-12"/>
+ </g>
+ <g transform="translate(112, 1456)">
+ <path d="m 0,8 16,0"/>
+ <path d="m 48,8 -16,0"/>
+ <path fill="#000" d="m 30,2 -14,-7 0,14 z"/>
+ <path fill="#000" d="m 18,14 14,-7 0,14 z"/>
+ <path d="m 32,-8 0,32"/>
+ <path d="m 16,-8 0,32"/>
+ </g>
+ <g transform="translate(48, 1360)">
+ <path d="m 0,8 48,0"/>
+ <path fill="#FFF" d="m 31,8 -13,-6 0,12 13,-6"/>
+ <path d="m 32,0 0,16"/>
+ <path d="m 32,8 8,-6 0,-18"/>
+ </g>
+ <g transform="translate(48, 1408)">
+ <path d="m 0,8 16,0"/>
+ <path d="m 48,8 -16,0"/>
+ <path fill="#FFF" d="m 30,2 -14,-7 0,14 z"/>
+ <path fill="#FFF" d="m 18,14 14,-7 0,14 z"/>
+ <path d="m 32,-8 0,32"/>
+ <path d="m 16,-8 0,32"/>
+ <path d="m 32,2 8,-6 0,-12"/>
+ </g>
+ <g transform="translate(48, 1456)">
+ <path d="m 0,8 16,0"/>
+ <path d="m 48,8 -16,0"/>
+ <path fill="#FFF" d="m 30,2 -14,-7 0,14 z"/>
+ <path fill="#FFF" d="m 18,14 14,-7 0,14 z"/>
+ <path d="m 32,-8 0,32"/>
+ <path d="m 16,-8 0,32"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="1372" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Silicon-controlled rectifier
(SCR)</text>
+ <text stroke="none" fill="#000" x="200" y="1420" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Triode for alternating current
(TRIAC)</text>
+ <text stroke="none" fill="#000" x="200" y="1468" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Diode for alternating current
(DIAC)</text>
+ <g transform="translate(144, 1504)">
+ <path d="m 8,0 0,4"/>
+ <path d="m 0,4 16,0"/>
+ <path d="m 2,8 12,0"/>
+ <path d="m 4,12 8,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="1516" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Earth ground</text>
+ <g transform="translate(144, 1536)">
+ <path d="m 8,0 0,4"/>
+ <path d="m -3.5,12 4,-8 16,0 -4,8"/>
+ <path d="m 4.5,12 4,-8"/>
+ </g>
+ <g fill="#FFF" transform="translate(144, 1568)">
+ <path d="m 8,0 0,4"/>
+ <path d="m 3,4 10,0 -5,10 z"/>
+ </g>
+ <g transform="translate(144, 1600)">
+ <path d="m 8,0 0,8"/>
+ <path d="m 0,8 16,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="1548" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Chassis ground</text>
+ <text stroke="none" fill="#000" x="200" y="1580" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Signal ground</text>
+ <text stroke="none" fill="#000" x="200" y="1612" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Arbitrary ground</text>
+ <g transform="translate(144, 1632)">
+ <path d="m 0,8 5,0"/>
+ <path d="m 5,2 0,12"/>
+ <path d="m 11,-4 0,24"/>
+ <path d="m 11,8 5,0"/>
+ </g>
+ <g transform="translate(112, 1664)">
+ <path d="m 0,8 15,0"/>
+ <path d="m 15,2 0,12"/>
+ <path d="m 21,-4 0,24"/>
+ <path d="m 27,2 0,12"/>
+ <path d="m 33,-4 0,24"/>
+ <path d="m 33,8 15,0"/>
+ </g>
+ <g transform="translate(112, 1696)">
+ <circle fill="#FFF" stroke-width="4" cy="24" cx="24" r="20"/>
+ <path d="m 0,24 4,0"/>
+ <path d="m 48,24 -4,0"/>
+ <path d="m 30,24 8,0"/>
+ <path d="m 34,20 0,8"/>
+ <path d="m 10,24 8,0"/>
+ </g>
+ <g transform="translate(112, 1760)">
+ <circle fill="#FFF" stroke-width="4" cy="24" cx="24" r="20"/>
+ <path d="m 0,24 4,0"/>
+ <path d="m 48,24 -4,0"/>
+ <path d="m 10,24 a 8,8 0 0 1 14,0 a 8,8 0 0 0 14,0"/>
+ </g>
+ <g transform="translate(112, 1824)">
+ <circle fill="#FFF" stroke-width="4" cy="24" cx="24" r="20"/>
+ <path d="m 0,24 4,0"/>
+ <path d="m 48,24 -4,0"/>
+ <path stroke-width="4" d="m 34,24 -22,0"/>
+ <path fill="#000" stroke="none" d="m 38,24 -10,-5 0,10 10,-5"/>
+ </g>
+ <g transform="translate(112, 1888)">
+ <polygon fill="#FFF" points="4,24 24,9 44,24 24,39 4,24"/>
+ <path d="m 0,24 4,0"/>
+ <path d="m 48,24 -4,0"/>
+ <path d="m 30,24 8,0"/>
+ <path d="m 34,20 0,8"/>
+ <path d="m 10,24 8,0"/>
+ </g>
+ <g transform="translate(112, 1936)">
+ <polygon fill="#FFF" points="4,24 24,9 44,24 24,39 4,24"/>
+ <path d="m 0,24 4,0"/>
+ <path d="m 48,24 -4,0"/>
+ <path stroke-width="4" d="m 34,24 -22,0"/>
+ <path fill="#000" stroke="none" d="m 38,24 -10,-5 0,10 10,-5"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="1644" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Cell</text>
+ <text stroke="none" fill="#000" x="200" y="1676" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Battery</text>
+ <text stroke="none" fill="#000" x="200" y="1724" style="font-size:
8pt;text-anchor: start;font-weight: normal;">DC voltage source</text>
+ <text stroke="none" fill="#000" x="200" y="1788" style="font-size:
8pt;text-anchor: start;font-weight: normal;">AC voltage source</text>
+ <text stroke="none" fill="#000" x="200" y="1852" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Current source</text>
+ <text stroke="none" fill="#000" x="200" y="1916" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Dependent voltage source</text>
+ <text stroke="none" fill="#000" x="200" y="1964" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Dependent current source</text>
+ <g fill="#FFF" transform="translate(112, 2000)">
+ <path d="m 0,8 12,0"/>
+ <path d="m 48,8 -12,0"/>
+ <circle cy="8" cx="12" r="3"/>
+ <circle cy="8" cx="36" r="3"/>
+ <path d="m 8,-2 32,0"/>
+ <path d="m 24,-2 0,-10"/>
+ </g>
+ <g fill="#FFF" transform="translate(112, 2048)">
+ <path d="m 0,8 12,0"/>
+ <path d="m 48,8 -12,0"/>
+ <circle cy="8" cx="12" r="3"/>
+ <circle cy="8" cx="36" r="3"/>
+ <path d="m 8,13 32,0"/>
+ <path d="m 24,13 0,-10"/>
+ </g>
+ <g fill="#FFF" transform="translate(112, 2096)">
+ <path d="m 0,8 12,0"/>
+ <path d="m 48,8 -12,0"/>
+ <path d="m 12,8 24.36,-10.57"/>
+ <circle cy="8" cx="12" r="3"/>
+ <circle cy="8" cx="36" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(112, 2144)">
+ <path d="m 0,8 12,0"/>
+ <path d="m 48,8 -12,0"/>
+ <path d="m 12,8 26,-5.4"/>
+ <circle cy="8" cx="12" r="3"/>
+ <circle cy="8" cx="36" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(112, 2192)">
+ <path d="m 0,8 8,0"/>
+ <path d="m 48,8 -8,0"/>
+ <path d="m 24,8 18,-5.8"/>
+ <path d="m 24,8 0,8"/>
+ <circle cy="8" cx="8" r="3"/>
+ <circle cy="8" cx="24" r="3"/>
+ <circle cy="8" cx="40" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(32, 2176)">
+ <path d="m 36,8 12,0"/>
+ <circle cy="8" cx="36" r="3"/>
+ <path d="m 36,40 12,0"/>
+ <circle cy="40" cx="36" r="3"/>
+ <path d="m 12,24 -12,0"/>
+ <path d="m 12,24 27,12"/>
+ <circle cy="24" cx="12" r="3"/>
+ </g>
+ <g transform="translate(112, 2240)">
+ <path d="m 12,24 15,0"/>
+ <path d="m 34.6,24 -8,-4 0,8" fill="#000" stroke="none"/>
+ <path d="m 32,8 8,0 0,-8"/>
+ <circle fill="#FFF" cy="8" cx="32" r="3"/>
+ <path d="m 32,40 8,0 0,8"/>
+ <circle fill="#FFF" cy="40" cx="32" r="3"/>
+ <path d="m 37.6,24 10.4,0"/>
+ <circle fill="#FFF" cy="24" cx="37.6" r="3"/>
+ <path d="m 12,24 -12,0"/>
+ <circle fill="#FFF" cy="24" cx="12" r="3"/>
+ </g>
+ <g transform="translate(112, 2320)">
+ <path d="m 12,24 10,0"/>
+ <path d="m 29.38,24 -8,-4 0,8" fill="#000" stroke="none"/>
+ <path d="m 12,24 -12,0"/>
+ <circle fill="#FFF" cy="24" cx="12" r="3"/>
+ <circle fill="#FFF" cy="3" cx="8" r="3"/>
+ <circle fill="#FFF" cy="45" cx="8" r="3"/>
+ <path d="M 25.63,40 40,40 40,48"/>
+ <circle fill="#FFF" cy="40.47" cx="25.63" r="3"/>
+ <path d="M 25.63,8 40,8 40,0"/>
+ <circle fill="#FFF" cy="7.53" cx="25.63" r="3"/>
+ <path d="M 33.38,24 48,24"/>
+ <circle fill="#FFF" cy="24" cx="33.38" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(112, 2400)">
+ <circle cy="12" cx="8" r="3"/>
+ <circle cy="12" cx="24" r="3"/>
+ <circle cy="12" cx="40" r="3"/>
+ <rect y="2" x="4" height="6" width="24"/>
+ </g>
+ <text stroke="none" fill="#000" x="200" y="2108" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Single-pole, single-throw switch,
open (SPST)</text>
+ <text stroke="none" fill="#000" x="200" y="2156" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Single-pole, single-throw switch,
closed (SPST)</text>
+ <text stroke="none" fill="#000" x="200" y="2012" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Momentary switch, normally
open</text>
+ <text stroke="none" fill="#000" x="200" y="2060" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Momentary switch, normally
closed</text>
+ <text stroke="none" fill="#000" x="200" y="2204" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Single-pole, double-throw switches
(SPDT)</text>
+ <text stroke="none" fill="#000" x="200" y="2268" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Three-way switch</text>
+ <text stroke="none" fill="#000" x="200" y="2348" style="font-size:
8pt;text-anchor: start;font-weight: normal;">5-way switch</text>
+ <text stroke="none" fill="#000" x="200" y="2412" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Sliding switch (SPDT)</text>
+ <g transform="translate(512, 240)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,24 23,0"/>
+ <path d="m 40,0 0,9 -18,9"/>
+ <path d="m 40,48 0,-9 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 40,39 -6,-8 -4,8 10,0"/>
+ </g>
+ <g transform="translate(432, 240)">
+ <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,24 23,0"/>
+ <path d="m 40,0 0,9 -18,9"/>
+ <path d="m 40,48 0,-9 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 40,39 -6,-8 -4,8 10,0"/>
+ </g>
+ <g transform="translate(512, 304) matrix(1, 0, 0, -1, 0, 48)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,24 23,0"/>
+ <path d="m 40,0 0,9 -18,9"/>
+ <path d="m 40,48 0,-9 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 40,39 -6,-8 -4,8 10,0"/>
+ </g>
+ <g transform="translate(432, 304)">
+ <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,24 23,0"/>
+ <path d="m 40,0 0,9 -18,9"/>
+ <path d="m 40,48 0,-9 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 26,16 6,-8 4,8 -10,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="252" style="font-size:
8pt;text-anchor: start;font-weight: normal;">NPN transistor</text>
+ <text stroke="none" fill="#000" x="600" y="316" style="font-size:
8pt;text-anchor: start;font-weight: normal;">PNP transistor</text>
+ <g transform="translate(512, 368)">
+ <circle fill="#FFF" cy="24" cx="29" r="23"/>
+ <g stroke-width="3.6" stroke="#000" transform="translate(0,
10.6667) scale(0.555556)">
+ <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,24 23,0"/>
+ <path d="m 72,9 -32,0 -18,9"/>
+ <path fill="#000" stroke="none" d="m 42,40 -9,-12 -6,12 15,0"/>
+ <line y2="54" y1="26" x2="55" x1="55" stroke-width="4"/>
+ <path d="m 22,30 20,10 13,0"/>
+ <path d="m 72,-19.2 0,44.2 -18,9"/>
+ <circle cy="9" cx="72" r="2.6"/>
+ <path d="m 72,67.2 0,-12.2 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 74,56 -9,-12 -6,12 15,0"/>
+ </g>
+ </g>
+ <g stroke-width="3.6" stroke="#000" transform="translate(432, 368)
translate(0, 10.6667) scale(0.555556)">
+ <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,24 23,0"/>
+ <path d="m 72,9 -32,0 -18,9"/>
+ <path fill="#000" stroke="none" d="m 42,40 -9,-12 -6,12 15,0"/>
+ <line y2="54" y1="26" x2="55" x1="55" stroke-width="4"/>
+ <path d="m 22,30 20,10 13,0"/>
+ <path d="m 72,-19.2 0,44.2 -18,9"/>
+ <circle cy="9" cx="72" r="2.6"/>
+ <path d="m 72,67.2 0,-12.2 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 74,56 -9,-12 -6,12 15,0"/>
+ </g>
+ <g transform="translate(512, 432)">
+ <circle fill="#FFF" cy="24" cx="29" r="23"/>
+ <g stroke-width="3.6" stroke="#000" transform="translate(0,
1.77778) scale(0.555556)">
+ <line y2="54" y1="26" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,40 23,0"/>
+ <path d="m 55,24 -13,0 -20,10"/>
+ <path d="m 72,55 -32,0 -18,-9"/>
+ <circle cy="55" cx="72" r="2.6"/>
+ <path fill="#000" stroke="none" d="m 26,32 9,-12 6,12 -15,0"/>
+ <line y2="38" y1="10" x2="55" x1="55" stroke-width="4"/>
+ <path d="m 72,-3.2 0,12.2 -18,9"/>
+ <path d="m 72,83.2 0,-44.2 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 58,16 9,-12 6,12 -15,0"/>
+ </g>
+ </g>
+ <g stroke-width="3.6" stroke="#000" transform="translate(432, 432)
translate(0, 1.77778) scale(0.555556)">
+ <line y2="54" y1="26" x2="23" x1="23" stroke-width="4"/>
+ <path d="m 0,40 23,0"/>
+ <path d="m 55,24 -13,0 -20,10"/>
+ <path d="m 72,55 -32,0 -18,-9"/>
+ <circle cy="55" cx="72" r="2.6"/>
+ <path fill="#000" stroke="none" d="m 26,32 9,-12 6,12 -15,0"/>
+ <line y2="38" y1="10" x2="55" x1="55" stroke-width="4"/>
+ <path d="m 72,-3.2 0,12.2 -18,9"/>
+ <path d="m 72,83.2 0,-44.2 -18,-9"/>
+ <path fill="#000" stroke="none" d="m 58,16 9,-12 6,12 -15,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="380" style="font-size:
8pt;text-anchor: start;font-weight: normal;">NPN Darlington pair</text>
+ <text stroke="none" fill="#000" x="600" y="444" style="font-size:
8pt;text-anchor: start;font-weight: normal;">PNP Darlington pair</text>
+ <g transform="translate(512, 496)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <path d="m 0,40 21,0 0,-33"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,38 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,10"/>
+ <path stroke-width="3" d="m 26.5,19 0,10"/>
+ <path stroke-width="3" d="m 26.5,33 0,10"/>
+ <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(432, 496)">
+ <path d="m 0,40 21,0 0,-33"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,38 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,10"/>
+ <path stroke-width="3" d="m 26.5,19 0,10"/>
+ <path stroke-width="3" d="m 26.5,33 0,10"/>
+ <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(512, 560)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <path d="m 0,8 21,0 0,34"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,10 0,14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,10"/>
+ <path stroke-width="3" d="m 26.5,19 0,10"/>
+ <path stroke-width="3" d="m 26.5,33 0,10"/>
+ <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(432, 560)">
+ <path d="m 0,8 21,0 0,34"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,10 0,14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,10"/>
+ <path stroke-width="3" d="m 26.5,19 0,10"/>
+ <path stroke-width="3" d="m 26.5,33 0,10"/>
+ <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="508" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Enhancement-mode N-MOSFET</text>
+ <text stroke="none" fill="#000" x="600" y="572" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Enhancement-mode P-MOSFET</text>
+ <g transform="translate(512, 624)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <path d="m 0,40 21,0 0,-33"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,38 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,38"/>
+ <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(432, 624)">
+ <path d="m 0,40 21,0 0,-33"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,38 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,38"/>
+ <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(512, 688)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <path d="m 0,8 21,0 0,34"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,10 0,14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,38"/>
+ <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(432, 688)">
+ <path d="m 0,8 21,0 0,34"/>
+ <path d="m 40,0 0,10 -13,0"/>
+ <path d="m 40,48 0,-10 -13,0"/>
+ <path d="m 40,10 0,14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,5 0,38"/>
+ <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="700" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Depletion-mode P-MOSFET</text>
+ <text stroke="none" fill="#000" x="600" y="636" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Depletion-mode N-MOSFET</text>
+ <g transform="translate(512, 752)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <path d="m 0,24 26,0"/>
+ <path d="m 40,0 0,14 -13,0"/>
+ <path d="m 40,48 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,9 0,30"/>
+ <path fill="#000" stroke="none" d="m 22,24 -8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(432, 752)">
+ <path d="m 0,24 26,0"/>
+ <path d="m 40,0 0,14 -13,0"/>
+ <path d="m 40,48 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,9 0,30"/>
+ <path fill="#000" stroke="none" d="m 22,24 -8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(512, 816)">
+ <circle fill="white" cy="24" cx="29" r="23"/>
+ <path d="m 0,24 26,0"/>
+ <path d="m 40,0 0,14 -13,0"/>
+ <path d="m 40,48 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,9 0,30"/>
+ <path fill="#000" stroke="none" d="m 12,24 8,4 0,-8 z"/>
+ </g>
+ <g transform="translate(432, 816)">
+ <path d="m 0,24 26,0"/>
+ <path d="m 40,0 0,14 -13,0"/>
+ <path d="m 40,48 0,-14 -13,0"/>
+ <path stroke-width="3" d="m 26.5,9 0,30"/>
+ <path fill="#000" stroke="none" d="m 12,24 8,4 0,-8 z"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="764" style="font-size:
8pt;text-anchor: start;font-weight: normal;">N-JFET</text>
+ <text stroke="none" fill="#000" x="600" y="828" style="font-size:
8pt;text-anchor: start;font-weight: normal;">P-JFET</text>
+ <g transform="translate(480, 880)">
+ <path fill="#FFF" d="m 8,8 0,64 64,-32 z"/>
+ <path d="m 13,56 8,0"/>
+ <path d="m 17,52 0,8"/>
+ <path d="m 13,24 8,0"/>
+ <path d="m 0,24 8,0"/>
+ <path d="m 0,56 8,0"/>
+ <path d="m 72,40 8,0"/>
+ </g>
+ <g transform="translate(480, 960)">
+ <path fill="#FFF" d="m 8,8 0,64 64,-32 z"/>
+ <path d="m 0,24 8,0"/>
+ <path d="m 0,56 8,0"/>
+ <path d="m 72,40 8,0"/>
+ </g>
+ <g fill="#FFF" transform="translate(528, 1040)">
+ <path d="m 32,24 -31,-15 0,30 z"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1104)">
+ <path d="m 0,1 24,0 a 23,23 0 0 1 0,46 l -24,0 z"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1168)">
+ <path d="m -3.5,1 19.5,0 a 40,46 0 0 1 32,23 a 40,46 0 0 1 -32,23
l -19.5,0 a 40,40 0 0 0 0,-46 z"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1232)">
+ <path fill="none" d="m -3.5,1 a 40,40 0 0 1 0,46"/>
+ <path d="m 2.5,1 13.5,0 a 40,46 0 0 1 32,23 a 40,46 0 0 1 -32,23 l
-13.5,0 a 40,40 0 0 0 0,-46 z"/>
+ </g>
+ <g transform="translate(544, 1328)">
+ <path d="m 3,12 8,0 4,-8"/>
+ <path d="m 19,4 -8,0 -4,8"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="1308" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Negation of digital input or
output</text>
+ <text stroke="none" fill="#000" x="600" y="1340" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Schmitt trigger</text>
+ <g fill="#FFF" transform="translate(544, 1296) matrix(-1, 0, 0, -1,
16, 16)">
+ <path d="m 0,8 16,0"/>
+ <circle cy="8" cx="13" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(496, 1296)">
+ <path d="m 0,8 16,0"/>
+ <circle cy="8" cx="13" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(736, 1136)">
+ <path d="m 0,1 24,0 a 23,23 0 0 1 0,46 l -24,0 z"/>
+ </g>
+ <g fill="#FFF" transform="translate(784, 1152) matrix(-1, 0, 0, -1,
16, 16)">
+ <path d="m 0,8 16,0"/>
+ <circle cy="8" cx="13" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(720, 1136)">
+ <path d="m 0,8 16,0"/>
+ <circle cy="8" cx="13" r="3"/>
+ </g>
+ <text stroke="none" fill="#000" x="760" y="1132" style="font-size:
8pt;text-anchor: middle;font-weight: normal;">Example</text>
+ <g transform="translate(512, 1376)">
+ <rect fill="#FFF" height="16" width="48" y="0" x="0"/>
+ <path d="m 8,32 0,-24 c 1.6,-17 4.8,-17 6.4,0 c 1.6,17 4.8,17
6.4,0 c 1.6,-17 4.8,-17 6.4,0 c 1.6,17 4.8,17 6.4,0 c 1.6,-17 4.8,-17 6.4,0 l
0,24"/>
+ <rect stroke="none" fill="#FFF" height="14" width="10" y="1"
x="1"/>
+ <rect stroke="none" fill="#FFF" height="14" width="8" y="1"
x="17"/>
+ <rect stroke="none" fill="#FFF" height="14" width="8" y="1"
x="30"/>
+ <rect stroke="none" fill="#FFF" height="14" width="4" y="1"
x="43"/>
+ </g>
+ <g transform="translate(512, 1424)">
+ <path d="m 0,8 8,0 0,8"/>
+ <path fill="#000" d="m 48,8 -15,0 2,3 2,-3"/>
+ <path fill="#000" d="m 48,24 -15,0 2,-3 2,3"/>
+ <path d="m 8,16 32,-3"/>
+ <circle fill="#FFF" cy="16" cx="8" r="3"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="1388" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Solenoid or relay coil</text>
+ <text stroke="none" fill="#000" x="600" y="1436" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Relay contacts</text>
+ <g transform="translate(448, 1424)">
+ <path d="m 48,24 -8,0"/>
+ <path fill="#000" d="m 48,8 -35,0 2,3 2,-3"/>
+ <path fill="#000" d="m 48,40 -35,0 2,-3 2,3"/>
+ <path d="m 40,24 -29.8,-12.1"/>
+ <circle fill="#FFF" cy="24" cx="40" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1472)">
+ <path d="m 0,24 48,0"/>
+ <circle cy="24" cx="24" r="16"/>
+ <path transform="rotate(45, 24, 24)" d="m 24,8 0,32"/>
+ <path transform="rotate(-45, 24, 24)" d="m 24,8 0,32"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1520)">
+ <path d="m 0,24 48,0"/>
+ <circle cy="24" cx="24" r="16"/>
+ <path transform="rotate(45, 24, 24)" d="m 24,8 0,32"/>
+ <path transform="rotate(-45, 24, 24)" d="m 24,8 0,32"/>
+ <path d="m 24,4 0,-6"/>
+ <path transform="rotate(45, 24, 24)" d="m 24,4 0,-6"/>
+ <path transform="rotate(-45, 24, 24)" d="m 24,4 0,-6"/>
+ <path d="m 24,44 0,6"/>
+ <path transform="rotate(45, 24, 24)" d="m 24,44 0,6"/>
+ <path transform="rotate(-45, 24, 24)" d="m 24,44 0,6"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1584)">
+ <path d="m 24,4 0,-6"/>
+ <path transform="rotate(45, 24, 24)" d="m 24,4 0,-6"/>
+ <path transform="rotate(-45, 24, 24)" d="m 24,4 0,-6"/>
+ <path d="m 24,44 0,6"/>
+ <path transform="rotate(45, 24, 24)" d="m 24,44 0,6"/>
+ <path transform="rotate(-45, 24, 24)" d="m 24,44 0,6"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1648)">
+ <circle cy="24" cx="24" r="16"/>
+ <path d="m 0,24 16,0 a 8,8 0 0 1 16,0 l 16,0"/>
+ </g>
+ <g transform="translate(448, 1648)">
+ <circle fill="#FFF" cy="24" cx="24" r="16"/>
+ <path fill="none" d="m 0,24 16,0 c 5,0 10,-4 10,-8 q 0,-4
-2.1,-4"/>
+ <path fill="none" d="m 48,24 -16,0 c -5,0 -10,-4 -10,-8 q 0,-4
2.1,-4"/>
+ </g>
+ <g fill="#FFF" transform="translate(512, 1712)">
+ <circle cy="24" cx="24" r="16"/>
+ <path d="m 0,24 16,0"/>
+ <path d="m 16,16 0,16"/>
+ <path d="m 48,24 -16,0"/>
+ <path d="m 32,16 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(448, 1712)">
+ <circle cy="24" cx="24" r="16"/>
+ <circle fill="#000" stroke="none" cy="30" cx="15" r="2.5"/>
+ <path d="m 0,24 20,0"/>
+ <path d="m 20,16 0,16"/>
+ <path d="m 48,24 -20,0"/>
+ <path d="m 28,16 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(384, 1712)">
+ <circle cy="24" cx="24" r="16"/>
+ <path d="m 0,24 16,0"/>
+ <path d="m 48,24 -16,0"/>
+ <path d="m 20,16 a 8.94,8.94 0 0 0 0,16 z"/>
+ <path d="m 28,16 a 8.94,8.94 0 0 1 0,16 z"/>
+ </g>
+ <g fill="#FFF" transform="translate(480, 1744)">
+ <circle cy="24" cx="24" r="16"/>
+ <path d="m 0,24 16,0"/>
+ <path d="m 48,24 -16,0"/>
+ <path d="m 12,20 0,8"/>
+ <path d="m 36,20 0,8"/>
+ <circle cy="24" cx="16" r="3"/>
+ <circle cy="24" cx="32" r="3"/>
+ <circle fill="#000" stroke="none" cy="34" cx="24" r="2.5"/>
+ </g>
+ <g fill="#FFF" transform="translate(416, 1744)">
+ <circle cy="24" cx="24" r="16"/>
+ <path d="m 0,24 16,0"/>
+ <path d="m 48,24 -16,0"/>
+ <circle cy="24" cx="16" r="3"/>
+ <circle cy="24" cx="32" r="3"/>
+ <circle fill="#000" stroke="none" cy="34" cx="24" r="2.5"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="1740" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Neon lamps</text>
+ <text stroke="none" fill="#000" x="600" y="1676" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Incandescent lamps</text>
+ <text stroke="none" fill="#000" x="600" y="1612" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Lamp light</text>
+ <text stroke="none" fill="#000" x="600" y="924" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Operational amplifier or
comparator</text>
+ <text stroke="none" fill="#000" x="600" y="1004" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Amplifier</text>
+ <text stroke="none" fill="#000" x="600" y="1068" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Digital buffer, or part of NOT
gate symbol</text>
+ <text stroke="none" fill="#000" x="600" y="1132" style="font-size:
8pt;text-anchor: start;font-weight: normal;">AND gate</text>
+ <text stroke="none" fill="#000" x="600" y="1196" style="font-size:
8pt;text-anchor: start;font-weight: normal;">OR gate</text>
+ <text stroke="none" fill="#000" x="600" y="1260" style="font-size:
8pt;text-anchor: start;font-weight: normal;">XOR gate</text>
+ <text stroke="none" fill="#000" x="600" y="1500" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Lamp, unlit</text>
+ <text stroke="none" fill="#000" x="600" y="1548" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Lamp, lit</text>
+ <g fill="#FFF" transform="translate(480, 1824)">
+ <circle stroke-width="3" r="40" cy="40" cx="40"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ </g>
+ <g transform="translate(496, 1856)">
+ <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+ </g>
+ <g transform="translate(496, 1888)">
+ <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+ <path d="m 0,72 20,0 3,-3"/>
+ </g>
+ <g transform="translate(496, 1968)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,48 48,0"/>
+ <path d="m 0,40 9,0 0,8 9,0"/>
+ </g>
+ <g transform="translate(496, 2000)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+ <path d="m 0,40 18,0"/>
+ </g>
+ <g transform="translate(496, 2016)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,48 48,0"/>
+ <path d="m 0,56 9,0 0,-8 9,0"/>
+ </g>
+ <g transform="translate(528, 2064)">
+ <path stroke-width="1" d="m 18,24 -6,0 a 36,36 0 0 0 12,44"/>
+ <circle fill="#000" stroke="none" r="2.5" cy="68" cx="24"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="1868" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Vacuum tube and anode</text>
+ <text stroke="none" fill="#000" x="600" y="1932" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Heating element</text>
+ <text stroke="none" fill="#000" x="600" y="2044" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Grid elements</text>
+ <text stroke="none" fill="#000" x="600" y="2108" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Supressor grid internal cathode
connection</text>
+ <g fill="#FFF" transform="translate(720, 1920)">
+ <circle stroke-width="3" r="40" cy="40" cx="40"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ </g>
+ <g transform="translate(720, 1920) matrix(-1, 0, 0, 1, 80, 0)">
+ <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+ <path d="m 0,72 20,0 3,-3"/>
+ </g>
+ <g transform="translate(720, 1920) matrix(-1, 0, 0, 1, 80, 0)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+ <path d="m 0,40 18,0"/>
+ </g>
+ <g transform="translate(720, 1920) matrix(-1, 0, 0, 1, 80, 0)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,24 48,0"/>
+ <path d="m 0,24 18,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="760" y="1900" style="font-size:
8pt;text-anchor: middle;font-weight: normal;">Example</text>
+ <g transform="translate(480, 2160)">
+ <g fill="#FFF">
+ <circle stroke-width="3" r="40" cy="40" cx="40"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ </g>
+ <g>
+ <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+ </g>
+ <g>
+ <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+ <path d="m 8,80 0,-6 10,0 5,-5"/>
+ </g>
+ </g>
+ <g transform="translate(480, 2256)">
+ <g fill="#FFF">
+ <circle stroke-width="3" r="40" cy="40" cx="40"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ </g>
+ <g>
+ <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+ </g>
+ <g>
+ <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+ <path d="m 8,80 0,-6 10,0 5,-5"/>
+ </g>
+ <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+ <path d="m 0,40 18,0"/>
+ </g>
+ </g>
+ <g transform="translate(480, 2352)">
+ <g fill="#FFF">
+ <circle stroke-width="3" r="40" cy="40" cx="40"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ </g>
+ <g>
+ <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+ </g>
+ <g>
+ <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+ <path d="m 8,80 0,-6 10,0 5,-5"/>
+ </g>
+ <g>
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,48 48,0"/>
+ <path d="m 0,40 9,0 0,8 9,0"/>
+ </g>
+ <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,32 48,0"/>
+ <path d="m 0,40 9,0 0,-8 9,0"/>
+ </g>
+ </g>
+ <g transform="translate(480, 2448)">
+ <g fill="#FFF">
+ <circle stroke-width="3" r="40" cy="40" cx="40"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ </g>
+ <g>
+ <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+ </g>
+ <g>
+ <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+ <path d="m 8,80 0,-6 10,0 5,-5"/>
+ </g>
+ <g>
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,56 48,0"/>
+ <path d="m 0,56 18,0"/>
+ </g>
+ <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+ <path d="m 0,40 18,0"/>
+ </g>
+ <g>
+ <path stroke-dasharray="4" stroke-width="3" d="m 18,24 48,0"/>
+ <path d="m 0,24 18,0"/>
+ </g>
+ <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+ <path stroke-width="1" d="m 18,24 -6,0 a 36,36 0 0 0 12,44"/>
+ <circle fill="#000" stroke="none" r="2.5" cy="68" cx="24"/>
+ </g>
+ </g>
+ <text stroke="none" fill="#000" x="824" y="1948" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Triode, heater omitted</text>
+ <text stroke="none" fill="#000" x="824" y="1964" style="font-size:
8pt;text-anchor: start;font-weight: normal;">All contacts on the right</text>
+ <g transform="translate(496, 1904)">
+ <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+ <path d="m 8,80 0,-6 10,0 5,-5"/>
+ </g>
+ <text stroke="none" fill="#000" x="600" y="1964" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Cathode</text>
+ <text stroke="none" fill="#000" x="600" y="2204" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Diode</text>
+ <text stroke="none" fill="#000" x="600" y="2300" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Triode</text>
+ <text stroke="none" fill="#000" x="600" y="2396" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Tetrode</text>
+ <text stroke="none" fill="#000" x="600" y="2492" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Pentode</text>
+ <g fill="#FFF" transform="translate(688, 2160)">
+ <path stroke-width="3" d="m 40,0 80,0 a 40,40 0 0 1 0,80 l -80,0 a
40,40 0 0 1 0,-80"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ <path d="m 120,0 0,16"/>
+ <path stroke-width="4" d="m 104,16 32,0"/>
+ </g>
+ <g fill="#FFF" transform="translate(736, 2288)">
+ <path d="m 0,40 a 40,40 0 0 1 80,0 l 0,32 a 40,40 0 0 1 -80,0 l
0,-32"/>
+ <path d="m 40,0 0,16"/>
+ <path stroke-width="4" d="m 24,16 32,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="696" y="2140" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Double-anode tube</text>
+ <text stroke="none" fill="#000" x="696" y="2284" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Long tube style</text>
+ <g transform="translate(896, 240)">
+ <rect fill="#FFF" height="32" width="8" y="8" x="0"/>
+ <path d="m 0,40 64,0"/>
+ <path d="m 12,8 6,6 6,-6 40,0"/>
+ <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+ </g>
+ <g transform="translate(896, 304)">
+ <rect fill="#FFF" height="32" width="8" y="8" x="0"/>
+ <path d="m 0,40 64,0"/>
+ <path d="m 12,8 6,6 6,-6 40,0"/>
+ <path d="m 24,24 6,-6 6,6 28,0"/>
+ <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="24" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+ </g>
+ <g transform="translate(896, 368)">
+ <rect fill="#FFF" height="32" width="8" y="8" x="0"/>
+ <path d="m 0,40 64,0"/>
+ <path d="m 12,8 6,6 6,-6 40,0"/>
+ <path d="m 30,16 0,8 34,0"/>
+ <path fill="#000" stroke="none" d="m 30,9 4,8 -8,0 z"/>
+ <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="24" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+ </g>
+ <g transform="translate(896, 432)">
+ <rect fill="#FFF" height="64" width="8" y="8" x="0"/>
+ <path d="m 0,72 64,0"/>
+ <path d="m 12,8 6,6 6,-6 40,0"/>
+ <path d="m 24,56 6,-6 6,6 28,0"/>
+ <path d="m 30,16 0,8 34,0"/>
+ <path fill="#000" stroke="none" d="m 30,9 4,8 -8,0 z"/>
+ <path d="m 46,48 0,-8 18,0"/>
+ <path fill="#000" stroke="none" d="m 46,55 4,-8 -8,0 z"/>
+ <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="24" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="56" cx="64" r="3"/>
+ <circle fill="#000" stroke="none" cy="72" cx="64" r="3"/>
+ </g>
+ <g transform="translate(912, 528)">
+ <circle r="8" cy="24" cx="24"/>
+ <circle r="16" cy="24" cx="24"/>
+ <path d="m 32,24 16,0"/>
+ <circle fill="#000" stroke="none" r="3" cy="24" cx="32"/>
+ <path d="m 24,40 0,8"/>
+ <circle fill="#000" stroke="none" r="3" cy="40" cx="24"/>
+ </g>
+ <g transform="translate(848, 528)">
+ <circle r="8" cy="24" cx="24"/>
+ <circle r="16" cy="24" cx="24"/>
+ <path d="m 32,24 16,0"/>
+ <circle fill="#000" stroke="none" r="3" cy="24" cx="32"/>
+ <path d="m 8,24 -8,0"/>
+ <circle fill="#000" stroke="none" r="3" cy="24" cx="8"/>
+ </g>
+ <text stroke="none" fill="#000" x="1000" y="268" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Phone jack, 2-conductor</text>
+ <text stroke="none" fill="#000" x="1000" y="332" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Phone jack, 3-conductor</text>
+ <text stroke="none" fill="#000" x="1000" y="396" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Phone jack with NC
connection</text>
+ <text stroke="none" fill="#000" x="1000" y="476" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Phone jack, 3-conductor, with NC
connections</text>
+ <text stroke="none" fill="#000" x="1000" y="556" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Phono jacks</text>
+ <g fill="#FFF" transform="translate(912, 608)">
+ <path d="m 0,8 17,0"/>
+ <path d="m 48,8 -17,0"/>
+ <path d="m 17,1 0,14"/>
+ <path d="m 31,1 0,14"/>
+ <rect height="16" width="6" y="0" x="21"/>
+ </g>
+ <g fill="#FFF" transform="translate(928, 640)">
+ <path d="m 2,0 16,16 0,16 -16,16 z"/>
+ <path d="m 18,16 12,0 0,16 -12,0 z"/>
+ <path d="m 24,16 0,-16"/>
+ <path d="m 24,32 0,16"/>
+ </g>
+ <g transform="translate(912, 720)">
+ <path d="m 0,8 8,0 a 18,18 0 1 1 32,0 l 8,0"/>
+ <circle fill="#FFF" cy="8" cx="8" r="5"/>
+ <circle fill="#FFF" cy="8" cx="40" r="5"/>
+ </g>
+ <g fill="#FFF" transform="translate(912, 752)">
+ <path d="m 0,24 48,0"/>
+ <circle stroke-width="3" cy="24" cx="24" r="16"/>
+ </g>
+ <g fill="#FFF" transform="translate(912, 800)">
+ <path d="m 0,24 48,0"/>
+ <rect height="12" width="8" y="18" x="4"/>
+ <rect height="12" width="8" y="18" x="36"/>
+ <circle cy="24" cx="24" r="16"/>
+ </g>
+ <g transform="translate(912, 864)">
+ <path d="m 24,0 0,32"/>
+ <path d="m 0,0 48,0 -24,24 z"/>
+ </g>
+ <g transform="translate(928, 912) matrix(0, 1, -1, 0, 32, 0)">
+ <path d="m 24,0 0,32"/>
+ <path d="m 0,0 48,0 -24,24 z"/>
+ </g>
+ <g transform="translate(912, 976)">
+ <path d="m 0,8 8,0 a 10,10 0 0 1 16,0 a 10,10 0 0 0 16,0 l 8,0"/>
+ <circle fill="#FFF" cy="8" cx="8" r="3"/>
+ <circle fill="#FFF" cy="8" cx="40" r="3"/>
+ </g>
+ <g fill="#FFF" transform="translate(848, 976)">
+ <rect height="8" width="24" y="4" x="12"/>
+ <path d="m 0,8 48,0"/>
+ </g>
+ <g transform="translate(912, 1008)">
+ <path d="m 0,8 16,0"/>
+ <path d="m 48,8 -16,0"/>
+ <path d="m 12,4 a 16,16 0 0 1 24,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="1000" y="620" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Crystal</text>
+ <text stroke="none" fill="#000" x="1000" y="668" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Speaker</text>
+ <text stroke="none" fill="#000" x="1000" y="716" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Headphones</text>
+ <text stroke="none" fill="#000" x="1000" y="780" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Generic two-terminal</text>
+ <text stroke="none" fill="#000" x="1000" y="828" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Motor</text>
+ <text stroke="none" fill="#000" x="1000" y="876" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Antenna</text>
+ <text stroke="none" fill="#000" x="1000" y="940" style="font-size:
8pt;text-anchor: start;font-weight: normal;">RF probe</text>
+ <text stroke="none" fill="#000" x="1000" y="988" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Fuse</text>
+ <text stroke="none" fill="#000" x="1000" y="1020" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Circuit breaker</text>
+ <g transform="translate(944, 1056)">
+ <path d="m -1,8 4,0 a 6,6 0 0 0 10,0 l 4,0"/>
+ </g>
+ <g fill="#FFF" transform="translate(944, 1088)">
+ <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+ <path d="m 8,0 0,16"/>
+ </g>
+ <text stroke="none" fill="#000" x="1000" y="1068" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Integrated circuit pin 1
mark</text>
+ <text stroke="none" fill="#000" x="1000" y="1100" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Integrated circuit pin</text>
+ <g transform="translate(1200, 1040)">
+ <path d="m -1,8 4,0 a 6,6 0 0 0 10,0 l 4,0"/>
+ </g>
+ <g fill="#FFF" transform="translate(1184, 1056)">
+ <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+ <path d="m 8,0 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(1184, 1072)">
+ <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+ <path d="m 8,0 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(1216, 1056) matrix(-1, 0, 0, -1,
16, 16)">
+ <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+ <path d="m 8,0 0,16"/>
+ </g>
+ <g fill="#FFF" transform="translate(1216, 1072) matrix(-1, 0, 0, -1,
16, 16)">
+ <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+ <path d="m 8,0 0,16"/>
+ </g>
+ <g transform="translate(1184, 1040)">
+ <path d="m 8,16 0,-8 8,0"/>
+ </g>
+ <g transform="translate(1216, 1040) matrix(0, 1, -1, 0, 16, 0)">
+ <path d="m 8,16 0,-8 8,0"/>
+ </g>
+ <g transform="translate(1184, 1088) matrix(0, -1, 1, 0, 0, 16)">
+ <path d="m 8,16 0,-8 8,0"/>
+ </g>
+ <g transform="translate(1216, 1088) matrix(-1, 0, 0, -1, 16, 16)">
+ <path d="m 8,16 0,-8 8,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="1208" y="1116" style="font-size:
8pt;text-anchor: middle;font-weight: normal;">Example</text>
+ <g transform="translate(944, 1136)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g transform="translate(928, 1136)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g transform="translate(912, 1136)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g transform="translate(896, 1136)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="2 2" transform="translate(944, 1152)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="2 2" transform="translate(928, 1152)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="2 2" transform="translate(912, 1152)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="2 2" transform="translate(896, 1152)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="3 4 4 4 3" transform="translate(944, 1168)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="3 4 4 4 3" transform="translate(928, 1168)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="3 4 4 4 3" transform="translate(912, 1168)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="3 4 4 4 3" transform="translate(896, 1168)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 8 5" transform="translate(944, 1184)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 8 5" transform="translate(928, 1184)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 8 5" transform="translate(912, 1184)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 8 5" transform="translate(896, 1184)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 3 2 3 5" transform="translate(944, 1200)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 3 2 3 5" transform="translate(928, 1200)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 3 2 3 5" transform="translate(912, 1200)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-dasharray="5 3 2 3 5" transform="translate(896, 1200)">
+ <path d="m -1,0 18,0"/>
+ </g>
+ <g stroke-width="1" stroke="#000" transform="translate(944, 1216)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-width="1" stroke="#000" transform="translate(928, 1216)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-width="1" stroke="#000" transform="translate(912, 1216)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-width="1" stroke="#000" transform="translate(896, 1216)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1"
stroke="#000" transform="translate(944, 1232)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1"
stroke="#000" transform="translate(928, 1232)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1"
stroke="#000" transform="translate(912, 1232)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1"
stroke="#000" transform="translate(896, 1232)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000"
transform="translate(944, 1248)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000"
transform="translate(928, 1248)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000"
transform="translate(912, 1248)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000"
transform="translate(896, 1248)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000"
transform="translate(944, 1264)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000"
transform="translate(928, 1264)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000"
transform="translate(912, 1264)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000"
transform="translate(896, 1264)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000"
transform="translate(944, 1280)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000"
transform="translate(928, 1280)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000"
transform="translate(912, 1280)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000"
transform="translate(896, 1280)">
+ <path d="m -0.5,0 17,0"/>
+ </g>
+ <text stroke="none" fill="#000" x="1000" y="1196" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Boxes and borders</text>
+ <g transform="translate(848, 1312)">
+ <circle cy="56" cx="56" r="48"/>
+ </g>
+ <g transform="translate(864, 1328)">
+ <circle cy="40" cx="40" r="40"/>
+ </g>
+ <g transform="translate(864, 1328)">
+ <circle cy="40" cx="40" r="32"/>
+ </g>
+ <g transform="translate(880, 1344)">
+ <circle cy="24" cx="24" r="24"/>
+ </g>
+ <g transform="translate(880, 1344)">
+ <circle cy="24" cx="24" r="16"/>
+ </g>
+ <g transform="translate(896, 1360)">
+ <circle cy="8" cx="8" r="8"/>
+ </g>
+ <text stroke="none" fill="#000" x="1000" y="1356" style="font-size:
8pt;text-anchor: start;font-weight: normal;">Circles</text>
+ </g>
+</svg>
\ No newline at end of file
- [elpa] externals/sketch-mode b944693 10/38: Add crop image feature AND add text transient into main, (continued)
- [elpa] externals/sketch-mode b944693 10/38: Add crop image feature AND add text transient into main, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode f82ed74 11/38: Update documentation (add screencast), ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 4d78311 18/38: Experimental object modify tabulated list, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode d42f84a 22/38: Add svg and sketch group definitions, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode e3c16c7 26/38: Merge branch 'implement-layers' (incl. undo-tree undo/redo), ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 951c284 28/38: Fix dot marker and rename (make internal) sketch-snap-to-grid, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode f0465ec 29/38: Remove sketch-interactive function, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 4c6a675 36/38: Fix load definition functionality (also set layers list), ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode bcb99c9 35/38: Implement text label and modify feature, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 49c3c04 34/38: Add dasharray feature, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 4a4e2ba 33/38: Implement import/snippet functionality,
ELPA Syncer <=
- [elpa] externals/sketch-mode 37af8f4 01/38: Initial commit, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 0f870a1 20/38: Implement load from definition buffer & modify object functionality, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode fadc554 21/38: Add xml processing instruction and DOCTYPE element (see #4), ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 414ec7c 15/38: Don't print coordinates to message buffer, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 87a0808 16/38: Fix file header, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 7583fcb 17/38: Fix variable names and implement svg lisp togglable side window, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 8b63796 19/38: First try: implement update for both type side-winows, ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode ec35bb4 23/38: Add xml processing instruction and DOCTYPE element (see #4), ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 846f4a0 24/38: Implement layers (incl. reformat labels), ELPA Syncer, 2021/09/15
- [elpa] externals/sketch-mode 6433b20 30/38: Add circle/ellipse labels, ELPA Syncer, 2021/09/15