любой трюк для добавления разделителя внутри сетки между строками в нужной точке

Чтобы добавить разделитель между строками в сетке, я знаю, как это сделать, с помощью параметр Разделители . Но это используется в конце, и тогда нужно знать номер строки, под которой должен находиться разделитель. Итак, для большой сетки я использую метод проб и ошибок, пока не найду правильный номер строки. Затем, когда я позже меняю сетку, мне придется снова провести пробу и ошибку, чтобы поставить разделитель в правильное место на случай, если он переместится после моих изменений.

В этом примере есть сетка с 3 строками, и я хочу добавить разделитель ниже, скажем, второй строки, чтобы я мог сделать это:

Grid[{
  {1},
  {2},
  {3}
  }, Frame -> True, Dividers -> {All, 3 -> True}]

Другой способ - поставить False и True , в правильном порядке, где мне нужен разделитель, например

Grid[{
  {1},
  {2},
  {3}
  }, Frame -> True, Dividers -> {All, {True, False, True, True}}]

enter image description here

Было бы неплохо, если бы я мог сделать что-то вроде этого (например, можно сделать для Manipulate) (конечно, это ниже здесь не работает)

Grid[{
  {1},
  {2},
  Delimiter,
  {3}
  }, Frame -> True]

или

Grid[{
  {1},
  {Item[2,Dividers->True]},
  {3}
  }, Frame -> True]

или тому подобное.

Это упростит сопровождение кода.

Я смотрел на использование Item и тому подобное для этого, но не мог понять.

Кто-нибудь знает, как это сделать?

edit:

Кстати, этот трюк, если это возможно, применим не только к разделителям. Но было бы полезно иметь возможность делать многие другие параметры сетки, которые теперь выполняются на уровне сетки, а также на уровне элементов.Например, если я хочу добавить лишний пробел после некоторой строки, будет проще сказать это в том темпе, в котором я хотел, чтобы это было сделано. Кроме того, если бы я хотел изменить размер элемента, это было бы проще сделать на месте, то же самое для интервалов и т. Д. Чтобы при перемещении / копировании кода для всей строки или элемента он был самодостаточным и копировал его со всеми его варианты вместе.

Я думаю, что теперь для этого может потребоваться добавление новой опции в Mathematica Grid, чтобы она работала правильно и соответствовала общему дизайну сетки.

Это все до тех пор, пока для Mathematica не будет создан конструктор графического интерфейса.

Я обнаружил, что трачу более 60% своего времени, когда пишу демо, чтобы настроить графический интерфейс, чтобы он соответствовал и выглядел правильно. С помощью конструктора графического интерфейса я могу вместо этого потратить это время на работу над алгоритмом. Когда я использую Matlab GUIDE для создания графического интерфейса, на создание аналогичного графического интерфейса у меня уходит менее 5% времени.

Я бы хотел, чтобы WRI создал конструктор графического интерфейса для Mathematica, я думаю, что это будет убийственное приложение для Mathematica, если вы спросите меня. Но никто меня не спросил :)

edit (2)

прокомментируйте красивое решение Mr Wizard ниже.
В основном я хотел эту функцию для сеток, которые я использую для размещения элементов управления для Manipulate . Вот простой пример:

Manipulate[x,

 Grid[{
   {Control[{{x, 0, "x"}, 0, 10, 1}]},
   {Control[{{y, 0, "y"}, 0, 10, 1}]}
   }, Frame -> None, Dividers -> {None, {False, True, False}}
  ]
 ]

enter image description here

(и мне нужно использовать Grid для настройки элементов управления). Я не могу использовать здесь вызовы функций. Я не могу написать, используя решение Wizard, приведенное ниже, следующее:

Manipulate[x,

 myGrid[{
   {Control[{{x, 0, "x"}, 0, 10, 1}]},
   spec["Divider"],
   {Control[{{y, 0, "y"}, 0, 10, 1}]}
   }, Frame -> None
  ],

 Initialization :>
  {
   specfunc["Divider", lst_] := Dividers -> {None, # -> True & /@ lst};

   myGrid[dat_, opts : OptionsPattern[]] :=
    Module[{x = 1}, 
     Grid[#, opts, Sequence @@ #2] & @@ 
      Reap[If[MatchQ[#, _spec], Sow[x, #[[1]]]; ## &[], x++; #] & /@ 
        dat, _, specfunc]
     ]

   }
 ]

Это дает ошибку, поскольку Mathematica пытается сначала прочитать тело Manipulate, чтобы проанализировать его, ПЕРЕД чтением и обработкой раздела инициализации.

Но вне Manipulate это, конечно же, сработает:

myGrid[{
  {Control[{{x, 0, "x"}, 0, 10, 1}]},
  spec["Divider"],
  {Control[{{y, 0, "y"}, 0, 10, 1}]}
  }, Frame -> None
 ]

specfunc["Divider", lst_] := Dividers -> {None, # -> True & /@ lst};
myGrid[dat_, opts : OptionsPattern[]] :=
 Module[{x = 1}, 
  Grid[#, opts, Sequence @@ #2] & @@ 
   Reap[If[MatchQ[#, _spec], Sow[x, #[[1]]]; ## &[], x++; #] & /@ 
     dat, _, specfunc]
  ]

enter image description here

Мне нужно потратить больше времени на это, чтобы посмотреть, смогу ли я заставить его работать внутри Manipulate.

Кстати, заставить такие вещи работать внутри Manipulate действительно сложно. Единственный известный мне трюк - это использование макросов с шаблоном With [{}, .... Grid ....] , который я узнал от Леонида.

Например, см. Этот мой вопрос

Как определить константы для использования с With [] в одном месте, а затем применить их позже?

edit (3) Возможно, я делаю что-то не так, но у меня возникают ошибки внутри Manipulate:

первый пример:

Manipulate[x,

 Evaluate@grid[{
    {Control[{{x, 0, "x"}, 0, 10, 1}]}
    }
   ],

 Initialization :> 
  {
   grid[tab_, opts___] := 
     Module[{divlocal, divglobal, div, pos}, 
      divglobal = (Dividers /. opts) /. Dividers -> {False, False};
      If[Depth[divglobal] == 1, divglobal = {divglobal, divglobal}];
      If[Length[divglobal] == 1, AppendTo[divglobal, False]];
      pos = Position[tab, Dividers -> _, 1];
      divlocal = 
       MapIndexed[# - #2[[1]] + 1 -> Dividers /. tab[[#]] &, 
        Flatten[pos]];
      divglobal[[2]] = {divglobal[[2]], divlocal};
      Grid[Delete[tab, pos], Dividers -> divglobal, opts]];


   }
 ]

выдает ошибку:

ReplaceAll::rmix: Elements of {False,{}} are a mixture of lists and nonlists. >>

то же самое, если я заменяю приведенное выше на

Evaluate@grid[{
   Dividers -> {Thick, Blue},
   {Control[{{x, 0, "x"}, 0, 10, 1}]}
   }
  ],

Tried Dynamic @ вместо Оценить @ не повезло. может быть небольшое исправление это все что нужно? или я не использую его правильно?

5
задан Community 23 May 2017 в 10:32
поделиться