2012-01-16 13 views
5

ग्रिड में पंक्तियों के बीच एक विभक्त जोड़ने के लिए, एक तरीका मुझे पता है कि इसे कैसे करना है Dividers विकल्प का उपयोग करके। लेकिन इसका अंत में उपयोग किया जाता है, और तब उसे उस पंक्ति संख्या को जानना चाहिए जिसमें विभाजक को इसके नीचे होना चाहिए। इसलिए, बड़े ग्रिड के लिए, जब तक मुझे सही पंक्ति संख्या नहीं मिल जाती, तब तक मैं खुद को परीक्षण और त्रुटि का उपयोग करता हूं। फिर जब मैं ग्रिड को बाद में बदलता हूं, तो मुझे अपने परिवर्तनों के बाद स्थानांतरित होने पर विभाजक को सही जगह पर रखने के लिए फिर से परीक्षण और त्रुटि करना पड़ता है।बिंदु पर पंक्तियों के बीच एक ग्रिड के अंदर एक विभक्त जोड़ने के लिए कोई चाल

इस उदाहरण में, वहाँ 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}}] 

की तरह में यह अच्छा होगा अगर मैं की तरह कुछ कर सकता है इस (बिल्कुल इस नीचे यहाँ काम नहीं करता) (जैसे एक हेरफेर के लिए क्या कर सकते हैं)

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

या

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

या इस तरह के बात।

यह कोड रखरखाव को आसान बना देगा।

मैंने आइटम का उपयोग करने और इस तरह के लिए उपयोग करने पर देखा, लेकिन इसे समझने में सक्षम नहीं था।

कोई भी ऐसा करने के लिए एक चाल के बारे में जानता है?

संपादित करें:

btw, यह चाल यदि संभव हो तो, केवल डिवाइडर पर लागू नहीं होता। लेकिन यह कई अन्य ग्रिड विकल्पों को करने में सक्षम होना उपयोगी होगा, जो अब ग्रिड स्तर पर किया जाता है, साथ ही आइटम स्तर पर भी किया जा सकता है। उदाहरण के लिए, यदि मैं कुछ पंक्ति के बाद एक अतिरिक्त स्थान जोड़ना चाहता हूं, तो यह गति से इतना आसान कहना आसान होगा कि मैं यह चाहता था। इसके अलावा, अगर मैं आइटम आकार को बदलना चाहता था, तो स्पॉटिंग आदि के लिए इसे स्थान पर करना आसान था .. ताकि जब पूरी पंक्ति या वस्तु के लिए कोड को स्थानांतरित/प्रतिलिपि बनाते हैं, तो यह स्वयं निहित होता है और इसे सभी के साथ कॉपी करता है एक साथ विकल्प।

मुझे लगता है कि अब इसे सही तरीके से काम करने और सभी ग्रिड डिज़ाइन के साथ संगत होने के लिए गणित ग्रिड में एक नया विकल्प जोड़ने की आवश्यकता हो सकती है।

यह सब तब तक है जब तक एक जीयूआई निर्माता गणित के लिए नहीं बनाया जाता है।

मुझे लगता है कि जब मैं जीयूआई फिट करने और सही दिखने के लिए एक डेमो लिखता हूं तो मुझे लगता है कि मैं अपने समय का 60% से अधिक खर्च करता हूं। एक जीयूआई बिल्डर के साथ, मैं इस समय एल्गोरिदम पर काम कर सकता हूं। जब मैं जीयूआई बनाने के लिए मैटलैब गाइड का उपयोग करता हूं, तो मुझे एक समान जीयूआई बनाने के लिए मेरे समय का 5% से कम समय लगता है।

मेरी इच्छा है कि डब्ल्यूआरआई गणित के लिए एक जीयूआई निर्माता बनायेगा, मुझे लगता है कि अगर आप मुझसे पूछें तो यह गणित के लिए हत्यारा ऐप होगा। लेकिन कोई शरीर मुझे :)

संपादित करें (2)

नीचे श्री जादूगर अच्छा समाधान पर टिप्पणी के लिए कहा।
मैं मुख्य रूप से 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 उपयोग करने के लिए है)। मैं यहां फ़ंक्शन कॉल का उपयोग नहीं कर सकता। मैं नीचे दिए गए जादूगर के समाधान का उपयोग नहीं लिख सकते हैं, निम्नलिखित:

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] 
    ] 

    } 
] 

यह एक त्रुटि देता है, के बाद से मेथेमेटिका की कोशिश करता है पहले पढ़ने और आरंभीकरण खंड प्रक्रिया से पहले यह पार्स करने के लिए, हेरफेर के शरीर को पढ़ने के लिए।

लेकिन बाहर हेरफेर, यह बिल्कुल काम करेगा:

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

मैं अगर मैं इसके अंदर काम में हेरफेर करने के लिए प्राप्त कर सकते हैं देखने के लिए, इस पर अधिक समय बिताने की जरूरत है।

बीटीडब्ल्यू, मैनिपुलेट के अंदर काम करने के लिए इस तरह की चीजें प्राप्त करना वाकई मुश्किल है। केवल मुझे पता है कि लियोनीड से मैंने With[{},.... Grid....] पैटर्न के साथ मैक्रोज़ का उपयोग कर रहा है।

ऐसी कठिनाइयों के उदाहरण के लिए, मेरा यह प्रश्न देखें

How to define constants for use with With[] in one place and then apply them later?

संपादित करें (3) मैं कुछ गलत कर, लेकिन मैं कुछ त्रुटियाँ हो रही है अंदर हेरफेर हो मेरे में:

पहला उदाहरण:

Manipulate[x, 

[email protected][{ 
    {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]]; 


    } 
] 

erro देता है r:

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

ही अगर मैं [email protected] कोई भाग्य के स्थान पर

[email protected][{ 
    Dividers -> {Thick, Blue}, 
    {Control[{{x, 0, "x"}, 0, 10, 1}]} 
    } 
    ], 

की कोशिश की [email protected] के साथ ऊपर की जगह। छोटे फिक्स हो सकता है क्या जरूरत है? या मैं इसका उपयोग नहीं कर रहा हूँ?

+0

हाय माइक। हां, मुझे पता है कि मैं डिवाइडर को कहां जोड़ना चाहता हूं, लेकिन लंबे जटिल ग्रिड में, उस स्थान पर एक कोड स्निपेट जोड़ना आसान है, जिसे मैं विभाजित करना चाहता हूं, बजाय नीचे कोड डालने के बजाय, और गिनना और बनाना है गलतियां। फिर फिर से, जब ग्रिड बदलता है। यह मेरा मुद्दा है। धन्यवाद – Nasser

+0

यूआई के हाथ कोडिंग बनाम गुई बिल्डर के पूरे अंक नेट पर कई स्थानों पर अच्छी तरह से चर्चा की गई है। मैं इसके बारे में और बात करना चाहता हूं, लेकिन मुझे नहीं लगता कि यह इसके लिए सही जगह है। हो सकता है कि जब हम अपना गणित मंच प्राप्त करें तो हम इसके बारे में और बात कर सकते हैं। लेकिन मेरे अनुभव से, एक जीयूआई बिल्डर का उपयोग हाथ कोडिंग पर बहुत से प्रोग्रामर समय बचाता है। जीयूआई बिल्डर का उपयोग करने के लिए लागत/समय विश्लेषण का समर्थन करता है। सहेजे गए समय का उपयोग अन्य महत्वपूर्ण चीजों के लिए किया जा सकता है। बीटीडब्ल्यू, मैं यहां बड़े जटिल यूआई के बारे में बात कर रहा हूं, एक साधारण या 2 स्लाइडर्स और एक बटन और एक प्लॉट प्रकार यूआई नहीं। – Nasser

+1

संपादन में (मैन) को 'मैनिपुलेट' प्राप्त करने के लिए आप 'गतिशील @ myGrid [...] 'के साथ नियंत्रण को प्रतिस्थापित कर सकते हैं। – Heike

उत्तर

4

यह समाधान आप उपयोग कर निर्दिष्ट उन के साथ तालिका में निर्दिष्ट पंक्तियों के बीच विभाजक के लिए विशिष्टताओं को गठबंधन करने के लिए अनुमति चाहिए Dividers विकल्प।

grid[tab_, opts___] := 
Module[{divlocal, divglobal, div, pos}, 

    (* extract option value of Dividers from opts to divglobal *) 
    (* default value is {False, False} *) 
    divglobal = (Dividers /. {opts}) /. Dividers -> {False, False}; 

    (* transform divglobal so that it is in the form {colspecs, rowspecs} *) 
    If[Head[divglobal] =!= List, divglobal = {divglobal, divglobal}]; 
    If[Length[divglobal] == 1, AppendTo[divglobal, False]]; 

    (* Extract positions of dividers between rows from tab *) 
    pos = Position[tab, Dividers -> _, 1]; 

    (* Build list of rules for divider specifications between rows *) 
    divlocal = MapIndexed[# - #2[[1]] + 1 -> Dividers /. tab[[#]] &, Flatten[pos]]; 

    (* Final settings for dividers are {colspecs, {rowspecs, divlocal}} *) 
    divglobal[[2]] = {divglobal[[2]], divlocal}; 
    Grid[Delete[tab, pos], Dividers -> divglobal, opts]] 

पंक्तियों आप इच्छित स्थान जहां spec या तो False, True है, या एक ग्राफिक्स निर्देश (रंग, मोटाई, आदि) पर Dividers->spec डालने की आवश्यकता के बीच एक विभक्त निर्दिष्ट करने के लिए। उदाहरण

tab = {{1, 2, 3}, Dividers -> {Thick, Blue}, {4, 5, 6}, {7, 8, 9}, 
    Dividers -> False, {10, 11, 12}}; 

grid[tab, Dividers -> All] 

Mathematica graphics

संपादित

के लिए मैं श्री जादूगर के अनुरोध पर मेरी कोड के लिए कुछ टिप्पणियाँ जोड़ दिया है।

+0

+1, हालांकि मैं कोड की प्रत्येक पंक्ति के लिए कुछ स्पष्टीकरण की सराहना करता हूं। –

+0

इसके अलावा, मुझे लगता है कि आपको '/। {Opts}' –

+0

हेइक, धन्यवाद चाहिए। लेकिन मुझे कुछ मिल रहा है मैनिपुलेट के अंदर काम करने में कठिनाई। मैंने गतिशील @ और मूल्यांकन किया @ लेकिन कुछ त्रुटियां प्राप्त कीं। उदाहरणों को दिखाएगा कि मैंने अपने संपादन (3) में कोशिश की है। – Nasser

2

मैं प्रस्ताव करता हूं कि आप एक नए सिर का उपयोग करें जो निर्देश (spec नीचे) रख सकता है, और एक नया फ़ंक्शन जो इन निर्देशों (specfunc नीचे) को व्यक्तिगत रूप से आवश्यक रूप से संसाधित करता है। लाभ यह है कि यह विभिन्न अंतःस्थापित निर्देशों के लिए आसानी से सामान्यीकृत किया जाता है, और प्रत्येक को मनमाने तरीके से संसाधित किया जा सकता है।

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

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

उपयोग:

dat = 
{ 
    {1, 2, 3}, 
    {4, 5, 6}, 
    spec["Divider"], 
    {7, 8, 9}, 
    spec["Divider"], 
    {"a", "b", "c"} 
}; 

myGrid[dat, Frame -> True] 

Mathematica graphics


प्रत्येक अनुदेश "Divider" के रूप में ऐसी एक भी स्ट्रिंग हो सकती है और आपको कोई उन्हें इस तरह का उपयोग कर संघर्ष है, तो आप spec को समाप्त कर सकता है और MatchQ[#, _String] और Sow[x, #] का उपयोग करें।


, अपनी अपडेट किए गए सवाल को संबोधित करते के रूप में मैं एक टिप्पणी में नोट नीचे मुझे विश्वास है कि यह अपने अंतिम Manipulate वस्तु में सबसे बुनियादी तत्वों का उपयोग करने, और उपकरणों बारे में मदद करने के लिए आप सबसे अधिक आसानी से इस वस्तु उत्पन्न अधिक समझ में आता है। मेरा मानना ​​है कि Manipulate ब्लॉक के अंदर इन प्रकार के अनुकूलन को बनाने का प्रयास विफल होने के लिए बर्बाद हो गया है, और शायद अजीब और अपारदर्शी तरीकों से।

फिर भी, इस विशेष मामले इस काम करने के लिए, हालांकि मुझे शक है यह मजबूत है प्रकट होता है के लिए:

Manipulate[x, 
Evaluate[ 
    {specfunc["Divider", lst_] := Dividers -> {All, # -> True & /@ lst}; 
    myGrid[dat_, opts : OptionsPattern[]] := 
    Module[{x = 1}, 
    Grid[#, opts, Sequence @@ #2] & @@ 
     Reap[If[MatchQ[#, _spec], Sow[x, #[[1]]]; ## &[], x++; #] & /@ 
     dat, _, specfunc]]}; 
    myGrid[{{Control[{{x, 0, "x"}, 0, 10, 1}]}, 
    spec["Divider"], {Control[{{y, 0, "y"}, 0, 10, 1}]}}, 
    Frame -> True] 
    ] 
] 
+0

धन्यवाद, यह वास्तव में साफ है, और मैं इसका उपयोग कर सकता हूं। लेकिन इस सुविधा के लिए मेरे पास मुख्य उपयोग मैनिपुलेट के लिए नियंत्रण निर्माण में है। और मैं उस संदर्भ में इसका उपयोग करने में सक्षम नहीं था। मुझे यह देखने के लिए और अधिक समय बिताना होगा कि मैं इसके लिए इसे अनुकूलित कर सकता हूं या नहीं। मैं अब समझने के लिए संपादन (2) जोड़ रहा हूं कि मेरा क्या मतलब है। समस्या यह है कि मैनिपुलेट नियंत्रण क्षेत्र में, पर्यावरण थोड़ा और अधिक प्रतिबंधित है और कुछ जो बाहर काम करता है, वहां आसानी से काम नहीं करते हैं। – Nasser

+1

@ नासर मुझे खेद है, मैं डेमो नहीं बनाता, और मुझे नहीं पता कि जिस तरह से आप कोशिश कर रहे हैं, 'मैनिपुलेट' के अंदर सबकुछ कैसे करें। मैं केवल मेटा प्रोग्रामिंग का सुझाव दे सकता हूं, जो कि उन उपकरणों का उपयोग करना आसान है जो निश्चित रूप से आवश्यक 'मैनिपुलेट' ऑब्जेक्ट उत्पन्न करते हैं। आपके मामले में 'ग्रिड' काम करता है, इसलिए मैं इसका इस्तेमाल करूंगा; इसके बजाय 'ग्रिड' ऑब्जेक्ट को अधिक आसानी से लिखने के लिए एक टूल बनाएं। क्या इससे कोई मदद मिलती है? –

+0

श्री विज़ार्ड, हेइक ने बस एक साधारण फिक्स की ओर इशारा किया। पूरी चीज के आसपास गतिशीलता जोड़ने के लिए बस जरूरी है। मुझे खुद कोशिश करनी चाहिए थी, और मैं बस इसे करने के लिए भूल गया था। एक बहुत अच्छा समाधान के लिए धन्यवाद। – Nasser

संबंधित मुद्दे

 संबंधित मुद्दे