在线绘制自定义节点

在线绘制自定义节点

你好,乐于助人的社区

我正在尝试创建一个自定义节点,用于工业绘图,以象征中断的部分,如下所示:

折线

这是我的 MWE:

\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz,esvect}
\usetikzlibrary{calc}

\tikzset{%
    VueInterromp/.style={
      rectangle,
      draw=none,
      minimum height=2cm,
      minimum width=1cm,
      inner sep=2pt,
     append after command={
            (\tikzlastnode.west) -- ($(\tikzlastnode.west)!0.5!(\tikzlastnode.east)+(-0.3,0)$) -- ++(75:1) -- ($(\tikzlastnode.west)!0.5!(\tikzlastnode.east)+(+0.3,0)+(75-180:1)$) -- ($(\tikzlastnode.west)!0.5!(\tikzlastnode.east)+(+0.3,0)$) -- (\tikzlastnode.east)
        }
    }
}

\begin{document} 
\begin{tikzpicture}

\draw[blue,thick] (-3,0) -- (3,0) node[pos=0.3,VueInterromp] {};

\end{tikzpicture}
\end{document}

问题 1

结果是:

失败的断线

正如人们所料,该线出现在节点后面。我试过了fill=white,它似乎不起作用,因为它覆盖了节点本身。

如果您有解决问题或改进我的代码的想法,我会听取。

谢谢。

问题2

我还注意到,如果线不是水平的,它就不起作用,sloped也不会切断它,所以可能是我做的不对……

\draw[blue,thick] (-3,0) -- (0,3) node[pos=0.3,VueInterromp,sloped] {} ;

得到:

在此处输入图片描述

问题 3

更进一步:画几条线:

\draw[blue,thick] (-3,0) -- (0,0) node[pos=0.3,VueInterromp,sloped] {} -- ++(-1.5,-3) ;

得到:

连续性失败

你会看到,下一条线的绘制从节点后面一点开始,而不是像我希望的那样从线的末尾开始。有什么想法吗?

问题 3.5

看看循环做了什么:

\draw[blue,thick] (-3,0) -- (0,0) node[pos=0.5,VueInterromp,sloped] {} node[pos=1] {} -- ++(-1.5,-3) -- cycle;

给出:

循环中断

任何贡献都值​​得赞赏。非常感谢。

答案1

定制 的风格就直接多了to path

VueInterromp 对自定义部分有 4 个步骤:

  • 中心点的位置
  • 部分的半宽/路径的长度(固定宽度也可以,但有点复杂)
  • 外侧与路径之间的角度
  • 外边长度

并且我们需要计算路径的斜率来获得外侧的斜率。

比例宽度

\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\tikzset{
  % #1 center pos, #2 half width/path width, #3 angle, #4 length
  VueInterromp/.style n args={4}{to path={
    let \p1 = (\tikztostart), \p2 = (\tikztotarget) in
    let \n1 = {\x2 - \x1}, \n2 = {\y2 - \y1} in
      \pgfextra{\pgfmathsetmacro{\diffx}{\n1 / 1cm}}
      \pgfextra{\pgfmathsetmacro{\diffy}{\n2 / 1cm}}
    let \n{sqrt} = {sqrt((\diffx)^2 + (\diffy)^2)},
      \n{sign} = {\diffy > 0 ? 1 : (\diffy < 0 ? -1 : (\diffx > 0 ? 1 : -1))} in
    let \n{ang} = {\n{sign} * acos(\diffx / \n{sqrt})} in
    \foreach \pos in {#1} {
      % left part
      -- ($(\tikztostart)!\pos - #2!(\tikztotarget)$)
      -- ++({\n{ang} + #3}:#4)
      -- ($(\tikztostart)!\pos!(\tikztotarget)$)
      % right part
      -- ($(\tikztostart)!\pos + #2!(\tikztotarget) + ({\n{ang} + #3 + 180}:#4)$)
      -- ($(\tikztostart)!\pos + #2!(\tikztotarget)$)
    }
    -- (\tikztotarget) \tikztonodes
  }}
}

\begin{document}
\ExplSyntaxOn
\ExplSyntaxOff
\begin{tikzpicture}
  \foreach \a [evaluate=\a as \x using \a / 14] in {1, ..., 12}{
    \draw (0, 0) \pgfextra{\edef\temp{\x}}
      to[VueInterromp={\temp}{.05}{70}{2mm}] ++({\a * 30}:3)
      to[VueInterromp={.5}{.1}{60}{2mm}] ++({\a *30 - 90}:1); % use ++ instead of +
  }
  \draw (-5, -5) to[VueInterromp={.2, .5, .8}{.08}{70}{1cm}] (5, -5);
\end{tikzpicture}
\end{document}

固定宽度

\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
  % #1 center pos, #2 half width, #3 angle, #4 length
  VueInterromp/.style n args={4}{to path={
    let \p1 = (\tikztostart), \p2 = (\tikztotarget) in
    let \n1 = {\x2 - \x1}, \n2 = {\y2 - \y1} in
      \pgfextra{\pgfmathsetmacro{\diffx}{\n1 / 1cm}}
      \pgfextra{\pgfmathsetmacro{\diffy}{\n2 / 1cm}}
    let \n{sqrt} = {sqrt((\diffx)^2 + (\diffy)^2)},
      \n{sign} = {\diffy > 0 ? 1 : (\diffy < 0 ? -1 : (\diffx > 0 ? 1 : -1))} in
    let \n{ang} = {\n{sign} * acos(\diffx / \n{sqrt})} in
    \foreach \pos in {#1} {
      % left part
      -- ($(\tikztostart)!\pos!(\tikztotarget) - (\n{ang}:#2)$)
      -- ++({\n{ang} + #3}:#4)
      -- ($(\tikztostart)!\pos!(\tikztotarget)$)
      % right part
      -- ($(\tikztostart)!\pos!(\tikztotarget) + (\n{ang}:#2) + ({\n{ang} + #3 + 180}:#4)$)
      -- ($(\tikztostart)!\pos!(\tikztotarget) + (\n{ang}:#2)$)
    }
    -- (\tikztotarget) \tikztonodes
  }}
}

\begin{document} 
\begin{tikzpicture}
  \foreach \a [evaluate=\a as \x using \a / 14] in {1, ..., 12}{
    \draw (0, 0) \pgfextra{\edef\temp{\x}}
      to[VueInterromp={\temp}{1.5mm}{70}{2mm}] ++({\a * 30}:3)
      to[VueInterromp={.5}{.1}{60}{2mm}] ++({\a *30 - 90}:1); % use ++ instead of +
  }
  \draw (-5, -5) to[VueInterromp={.2, .5, .8}{.8cm}{70}{1cm}] (5, -5);
\end{tikzpicture}
\end{document}

在此处输入图片描述

更改日志

  • 5.31-1改为atan2判断acos路径的方向
  • 5.31-2变更示例
  • 6.1 添加for循环绘制多个vueinterromps

相关内容